diff --git a/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj b/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj
index 777c64f84..adcf12614 100644
--- a/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj
+++ b/DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj
@@ -66,6 +66,7 @@
+
@@ -127,4 +128,4 @@
-
\ No newline at end of file
+
diff --git a/DiscImageChef.CommonTypes/Interfaces/IArchive.cs b/DiscImageChef.CommonTypes/Interfaces/IArchive.cs
new file mode 100644
index 000000000..b71dab40e
--- /dev/null
+++ b/DiscImageChef.CommonTypes/Interfaces/IArchive.cs
@@ -0,0 +1,253 @@
+// /***************************************************************************
+// The Disc Image Chef
+// ----------------------------------------------------------------------------
+//
+// Filename : IArchive.cs
+// Author(s) : Michael Drüing
+//
+// Component : Archives.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Defines the interface for an Archive.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 2.1 of the
+// License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2018-2019 Michael Drüing
+// Copyright © 2011-2019 Natalia Portillo
+// ****************************************************************************/
+
+using System;
+using System.IO;
+using System.Collections.Generic;
+
+namespace DiscImageChef.CommonTypes.Interfaces
+{
+ [Flags]
+ public enum ArchiveSupportedFeature : uint
+ {
+ ///
+ /// The archive supports filenames for its entries. If this flag is not set,
+ /// files can only be accessed by number.
+ ///
+ SupportsFilenames = 1 << 0,
+
+ ///
+ /// The archive supports compression. If this flag is not set, compressed and
+ /// uncompressed lengths are always the same.
+ ///
+ SupportsCompression = 1 << 1,
+
+ ///
+ /// The archive supports subdirectories. If this flag is not set, all filenames are
+ /// guaranteed to not contain any "/" character.
+ ///
+ SupportsSubdirectories = 1 << 2,
+
+ ///
+ /// The archive supports explicit entries for directories (like Zip, for example).
+ /// If this flag is not set, directories are implicit by the relative name of the files.
+ ///
+ HasExplicitDirectories = 1 << 3,
+
+ ///
+ /// The archive stores a timestamp with each entry if this flag is set.
+ ///
+ HasEntryTimestamp = 1 << 4,
+
+ ///
+ /// If this flag is set, individual files or the whole archive might be encrypted or
+ /// password-protected.
+ ///
+ SupportsProtection = 1 << 5, // TODO: not implemented yet
+
+ ///
+ /// If this flag is set, the archive supports returning extended attributes (Xattrs) for each entry.
+ ///
+ SupportsXAttrs = 1 << 6,
+ };
+
+ public interface IArchive
+ {
+ /// Descriptive name of the plugin
+ string Name { get; }
+
+ /// Unique UUID of the plugin
+ Guid Id { get; }
+
+ ///
+ /// Identifies if the specified path contains data recognizable by this archive instance
+ ///
+ /// Path.
+ bool Identify(string path);
+
+ ///
+ /// Identifies if the specified stream contains data recognizable by this archive instance
+ ///
+ /// Stream.
+ bool Identify(Stream stream);
+
+ ///
+ /// Identifies if the specified buffer contains data recognizable by this archive instance
+ ///
+ /// Buffer.
+ bool Identify(byte[] buffer);
+
+ ///
+ /// Opens the specified path with this archive instance
+ ///
+ /// Path.
+ void Open(string path);
+
+ ///
+ /// Opens the specified stream with this archive instance
+ ///
+ /// Stream.
+ void Open(Stream stream);
+
+ ///
+ /// Opens the specified buffer with this archive instance
+ ///
+ /// Buffer.
+ void Open(byte[] buffer);
+
+ ///
+ /// Returns true if the archive has a file/stream/buffer currently opened and no
+ /// has been issued.
+ ///
+ bool IsOpened();
+
+ ///
+ /// Closes all opened streams.
+ ///
+ void Close();
+
+ ///
+ /// Return a bitfield indicating the features supported by this archive type.
+ ///
+ /// The ArchiveSupportedFeature bitfield.
+ ///
+ /// This should be a constant, tied to the archive type, not to the particular
+ /// features used by the currently-opened archive file.
+ ///
+ ArchiveSupportedFeature GetArchiveFeatures();
+
+ ///
+ /// Gets the number of entries (i.e. files) that are contained in this archive.
+ ///
+ ///
+ /// Entries in this context can also mean directories or volume labels, for some types of
+ /// archives that store these explicitly. Do not rely on all entries being regular files!
+ ///
+ /// The number of files.
+ int GetNumberOfEntries();
+
+ ///
+ /// Gets the file name (and path) of the given entry in the archive.
+ ///
+ ///
+ /// The path components are separated by a forward slash "/".
+ /// The path should not start with a leading slash (i.e. it should be relative, not absolute).
+ ///
+ ///
+ /// The entry in the archive for which to return the file name.
+ /// The file name, with (relative) path
+ string GetFilename(int entryNumber);
+
+ ///
+ /// Gets the entry number for a particular file path in the archive. fileName is
+ /// the relative path of the file in the archive. If the file cannot be found, -1 is returned.
+ ///
+ ///
+ /// The path should be relative (no leading slash), using regular slashes as path separator, and be
+ /// normalized, i.e. no "foo//bar" or "foo/../bar" path components.
+ ///
+ /// The relative path for which to get the entry number.
+ /// If set, do a case insensitive matching and return the first file that matches.
+ /// The number of the entry corresponding to the given path, or -1 if the path does not exist.
+ int GetEntryNumber(string fileName, bool caseInsensitiveMatch);
+
+ ///
+ /// Gets the (compressed) size of the given entry.
+ ///
+ /// The entry for which to get the compressed size.
+ /// The compressed size of the entry, or 0 if the entry is not a regular file.
+ ///
+ /// The return value is equal to the return value of GetUncompressedSize() if the file is not compressed.
+ ///
+ ///
+ long GetCompressedSize(int entryNumber);
+
+ ///
+ /// Gets the uncompressed size of the given entry.
+ ///
+ /// The entry for which to get the uncompressed size.
+ /// The uncompressed size of the entry, or 0 if the entry is not a regular file.
+ ///
+ /// The return value is equal to the return value of GetCompressedSize() if the file is not compressed.
+ ///
+ ///
+ long GetUncompressedSize(int entryNumber);
+
+ ///
+ /// Gets the attributes of a file or directory.
+ ///
+ ///
+ /// Error number.
+ /// The entry in the archive for which to retreive the attributes.
+ /// File attributes, or zero if the archive does not support attributes.
+ FileAttributes GetAttributes(int entryNumber);
+
+ ///
+ /// Lists all extended attributes, alternate data streams and forks of the given file.
+ ///
+ /// The entry in the archive for which to retreive the list of attributes.
+ /// List of extended attributes, alternate data streams and forks.
+ List GetXAttrs(int entryNumber);
+
+ ///
+ /// Reads an extended attribute, alternate data stream or fork from the given file.
+ ///
+ /// Error number.
+ /// The entry in the archive for which to retreive the XAttr.
+ /// Extended attribute, alternate data stream or fork name.
+ /// Buffer with the XAttr data.
+ byte[] GetXattr(int entryNumber, string xattr);
+
+ ///
+ /// Gets information about an entry in the archive.
+ ///
+ ///
+ /// Note that some of the data might be incomplete or not available at all, depending on the type of
+ /// archive.
+ ///
+ ///
+ ///
+ /// The entry int he archive for which to get the information
+ /// The available information about the entry in the archive
+ FileSystemInfo Stat(int entryNumber);
+
+ ///
+ /// Returns the Filter for the given entry. It will return null if the entry in question
+ /// is not a regular file (i.e. directory, volume label, etc.)
+ ///
+ /// The entry for which the Filter should be returned.
+ /// The Filter for the given entry.
+ IFilter GetEntry(int entryNumber);
+ }
+}
+