diff --git a/DiscImageChef.DiscImages/CDRWin/CDRWin.cs b/DiscImageChef.DiscImages/CDRWin/CDRWin.cs index 6a185ff1d..5c0fb965e 100644 --- a/DiscImageChef.DiscImages/CDRWin/CDRWin.cs +++ b/DiscImageChef.DiscImages/CDRWin/CDRWin.cs @@ -41,43 +41,31 @@ namespace DiscImageChef.DiscImages // TODO: Implement track flags public partial class CdrWin : IWritableOpticalImage, IVerifiableImage { - IFilter cdrwinFilter; - StreamReader cueStream; - StreamWriter descriptorStream; - CdrWinDisc discimage; - ImageInfo imageInfo; - Stream imageStream; + IFilter _cdrwinFilter; + StreamReader _cueStream; + StreamWriter _descriptorStream; + CdrWinDisc _discImage; + ImageInfo _imageInfo; + Stream _imageStream; /// Dictionary, index is track #, value is TrackFile - Dictionary offsetmap; - bool separateTracksWriting; - Dictionary trackFlags; - Dictionary trackIsrcs; - string writingBaseName; - Dictionary writingStreams; - List writingTracks; + Dictionary _offsetMap; + bool _separateTracksWriting; + Dictionary _trackFlags; + Dictionary _trackIsrcs; + string _writingBaseName; + Dictionary _writingStreams; + List _writingTracks; - public CdrWin() + public CdrWin() => _imageInfo = new ImageInfo { - imageInfo = new ImageInfo - { - ReadableSectorTags = new List(), - ReadableMediaTags = new List(), - HasPartitions = true, - HasSessions = true, - Version = null, - ApplicationVersion = null, - MediaTitle = null, - Creator = null, - MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, - MediaSequence = 0, - LastMediaSequence = 0, - DriveManufacturer = null, - DriveModel = null, - DriveSerialNumber = null, - DriveFirmwareRevision = null - }; - } + ReadableSectorTags = new List(), ReadableMediaTags = new List(), + HasPartitions = true, HasSessions = true, Version = null, + ApplicationVersion = null, + MediaTitle = null, Creator = null, MediaManufacturer = null, + MediaModel = null, + MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, + DriveManufacturer = null, + DriveModel = null, DriveSerialNumber = null, DriveFirmwareRevision = null + }; } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/CDRWin/Constants.cs b/DiscImageChef.DiscImages/CDRWin/Constants.cs index 8c3672aa7..4a46a182c 100644 --- a/DiscImageChef.DiscImages/CDRWin/Constants.cs +++ b/DiscImageChef.DiscImages/CDRWin/Constants.cs @@ -137,6 +137,7 @@ namespace DiscImageChef.DiscImages const string REGEX_SESSION = @"\bREM\s+SESSION\s+(?\d+).*$"; const string REGEX_MEDIA_TYPE = @"\bREM\s+ORIGINAL MEDIA-TYPE:\s+(?.+)$"; const string REGEX_LEAD_OUT = @"\bREM\s+LEAD-OUT\s+(?[\d]+:[\d]+:[\d]+)$"; + // Not checked const string REGEX_LBA = @"\bREM MSF:\s+(?[\d]+:[\d]+:[\d]+)\s+=\s+LBA:\s+(?[\d]+)$"; const string REGEX_DISC_ID = @"\bDISC_ID\s+(?[\da-f]{8})$"; @@ -157,6 +158,7 @@ namespace DiscImageChef.DiscImages const string REGEX_PREGAP = @"\bPREGAP\s+(?[\d]+:[\d]+:[\d]+)$"; const string REGEX_POSTGAP = @"\bPOSTGAP\s+(?[\d]+:[\d]+:[\d]+)$"; const string REGEX_FLAGS = @"\bFLAGS\s+(((?DCP)|(?4CH)|(?
PRE)|(?SCMS))\s*)+$";
+
         // Trurip extensions
         const string REGEX_APPLICATION        = @"\bREM\s+Ripping Tool:\s+(?.+)$";
         const string REGEX_TRURIP_DISC_HASHES = @"\bREM\s+DISC\s+HASHES$";
@@ -169,5 +171,9 @@ namespace DiscImageChef.DiscImages
         const string REGEX_TRURIP_TRACK_MD5     = @"\bREM\s+(Gap|Trk)\s+(?\d{2}):\s+[\da-f]{32}$";
         const string REGEX_TRURIP_TRACK_SHA1    = @"\bREM\s+(Gap|Trk)\s+(?\d{2}):\s+[\da-f]{40}$";
         const string REGEX_TRURIP_TRACK_UNKNOWN = @"\bREM\s+(Gap|Trk)\s+(?\d{2}):\s+[\da-f]{8,}$";
+        const string REGEX_DIC_MEDIA_TYPE       = @"\bREM\s+METADATA DIC MEDIA-TYPE:\s+(?.+)$";
+        const string REGEX_APPLICATION_VERSION  = @"\bREM\s+Ripping Tool Version:\s+(?.+)$";
+        const string REGEX_DUMP_EXTENT =
+            @"\bREM\s+METADATA DUMP EXTENT:\s+(?.+)\s+\|\s+(?.+)\s+\|\s+(?.+)\s+\|\s+(?.+)\s+\|\s+(?.+)\s+\|\s+(?.+)\s+\|\s+(?.+)\s+\|\s+(?\d+):(?\d+)$";
     }
 }
\ No newline at end of file
diff --git a/DiscImageChef.DiscImages/CDRWin/Helpers.cs b/DiscImageChef.DiscImages/CDRWin/Helpers.cs
index 2d0898a89..4f138a6e5 100644
--- a/DiscImageChef.DiscImages/CDRWin/Helpers.cs
+++ b/DiscImageChef.DiscImages/CDRWin/Helpers.cs
@@ -38,14 +38,14 @@ namespace DiscImageChef.DiscImages
 {
     public partial class CdrWin
     {
-        static ulong CdrWinMsftoLba(string msf)
+        static ulong CdrWinMsfToLba(string msf)
         {
             string[] msfElements = msf.Split(':');
             ulong    minute      = ulong.Parse(msfElements[0]);
             ulong    second      = ulong.Parse(msfElements[1]);
             ulong    frame       = ulong.Parse(msfElements[2]);
 
-            ulong sectors = minute * 60 * 75 + second * 75 + frame;
+            ulong sectors = (minute * 60 * 75) + (second * 75) + frame;
 
             return sectors;
         }
@@ -144,8 +144,8 @@ namespace DiscImageChef.DiscImages
             }
         }
 
-        static (byte minute, byte second, byte frame) LbaToMsf(ulong sector) =>
-            ((byte)(sector / 75 / 60), (byte)(sector / 75 % 60), (byte)(sector % 75));
+        static(byte minute, byte second, byte frame) LbaToMsf(ulong sector) =>
+            ((byte)(sector / 75 / 60), (byte)((sector / 75) % 60), (byte)(sector % 75));
 
         static string GetTrackMode(Track track)
         {
@@ -235,7 +235,7 @@ namespace DiscImageChef.DiscImages
                 case MediaType.HDDVDROM:  return CDRWIN_DISK_TYPE_HDDVD;
                 case MediaType.HDDVDRW:   return CDRWIN_DISK_TYPE_HDDVDRW;
                 case MediaType.HDDVDRWDL: return CDRWIN_DISK_TYPE_HDDVDRWDL;
-                default:                  return "";
+                default:                  return"";
             }
         }
     }
diff --git a/DiscImageChef.DiscImages/CDRWin/Identify.cs b/DiscImageChef.DiscImages/CDRWin/Identify.cs
index 2b8647435..93f4fdfc0 100644
--- a/DiscImageChef.DiscImages/CDRWin/Identify.cs
+++ b/DiscImageChef.DiscImages/CDRWin/Identify.cs
@@ -43,7 +43,7 @@ namespace DiscImageChef.DiscImages
         // Due to .cue format, this method must parse whole file, ignoring errors (those will be thrown by OpenImage()).
         public bool Identify(IFilter imageFilter)
         {
-            cdrwinFilter = imageFilter;
+            _cdrwinFilter = imageFilter;
 
             try
             {
@@ -51,37 +51,45 @@ namespace DiscImageChef.DiscImages
                 byte[] testArray = new byte[512];
                 imageFilter.GetDataForkStream().Read(testArray, 0, 512);
                 imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
+
                 // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin
                 bool twoConsecutiveNulls = false;
+
                 for(int i = 0; i < 512; i++)
                 {
-                    if(i >= imageFilter.GetDataForkStream().Length) break;
+                    if(i >= imageFilter.GetDataForkStream().Length)
+                        break;
 
                     if(testArray[i] == 0)
                     {
-                        if(twoConsecutiveNulls) return false;
+                        if(twoConsecutiveNulls)
+                            return false;
 
                         twoConsecutiveNulls = true;
                     }
-                    else twoConsecutiveNulls = false;
+                    else
+                        twoConsecutiveNulls = false;
 
-                    if(testArray[i] < 0x20 && testArray[i] != 0x0A && testArray[i] != 0x0D && testArray[i] != 0x00)
+                    if(testArray[i] < 0x20  &&
+                       testArray[i] != 0x0A &&
+                       testArray[i] != 0x0D &&
+                       testArray[i] != 0x00)
                         return false;
                 }
 
-                cueStream = new StreamReader(cdrwinFilter.GetDataForkStream());
+                _cueStream = new StreamReader(_cdrwinFilter.GetDataForkStream());
 
-                while(cueStream.Peek() >= 0)
+                while(_cueStream.Peek() >= 0)
                 {
-                    string line = cueStream.ReadLine();
+                    string line = _cueStream.ReadLine();
 
-                    Regex sr = new Regex(REGEX_SESSION);
-                    Regex rr = new Regex(REGEX_COMMENT);
-                    Regex cr = new Regex(REGEX_MCN);
-                    Regex fr = new Regex(REGEX_FILE);
-                    Regex tr = new Regex(REGEX_CDTEXT);
+                    var sr = new Regex(REGEX_SESSION);
+                    var rr = new Regex(REGEX_COMMENT);
+                    var cr = new Regex(REGEX_MCN);
+                    var fr = new Regex(REGEX_FILE);
+                    var tr = new Regex(REGEX_CDTEXT);
 
-                    // First line must be SESSION, REM, CATALOG,  FILE or CDTEXTFILE.
+                    // First line must be SESSION, REM, CATALOG, FILE or CDTEXTFILE.
                     Match sm = sr.Match(line ?? throw new InvalidOperationException());
                     Match rm = rr.Match(line);
                     Match cm = cr.Match(line);
@@ -95,9 +103,10 @@ namespace DiscImageChef.DiscImages
             }
             catch(Exception ex)
             {
-                DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", cdrwinFilter);
-                DicConsole.ErrorWriteLine("Exception: {0}",                              ex.Message);
-                DicConsole.ErrorWriteLine("Stack trace: {0}",                            ex.StackTrace);
+                DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", _cdrwinFilter);
+                DicConsole.ErrorWriteLine("Exception: {0}", ex.Message);
+                DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace);
+
                 return false;
             }
         }
diff --git a/DiscImageChef.DiscImages/CDRWin/Properties.cs b/DiscImageChef.DiscImages/CDRWin/Properties.cs
index 839ff805c..665eea96d 100644
--- a/DiscImageChef.DiscImages/CDRWin/Properties.cs
+++ b/DiscImageChef.DiscImages/CDRWin/Properties.cs
@@ -41,12 +41,13 @@ namespace DiscImageChef.DiscImages
 {
     public partial class CdrWin
     {
-        public ImageInfo       Info       => imageInfo;
+        public ImageInfo       Info       => _imageInfo;
         public string          Name       => "CDRWin cuesheet";
         public Guid            Id         => new Guid("664568B2-15D4-4E64-8A7A-20BDA8B8386F");
         public string          Format     => "CDRWin CUESheet";
         public string          Author     => "Natalia Portillo";
         public List Partitions { get; private set; }
+
         public List Tracks
         {
             get
@@ -55,36 +56,34 @@ namespace DiscImageChef.DiscImages
 
                 ulong previousStartSector = 0;
 
-                foreach(CdrWinTrack cdrTrack in discimage.Tracks)
+                foreach(CdrWinTrack cdrTrack in _discImage.Tracks)
                 {
-                    Track dicTrack = new Track
+                    var dicTrack = new Track
                     {
-                        Indexes                = cdrTrack.Indexes,
-                        TrackDescription       = cdrTrack.Title,
-                        TrackStartSector       = previousStartSector,
-                        TrackPregap            = cdrTrack.Pregap,
-                        TrackSession           = cdrTrack.Session,
-                        TrackSequence          = cdrTrack.Sequence,
-                        TrackType              = CdrWinTrackTypeToTrackType(cdrTrack.Tracktype),
-                        TrackFile              = cdrTrack.Trackfile.Datafilter.GetFilename(),
-                        TrackFilter            = cdrTrack.Trackfile.Datafilter,
-                        TrackFileOffset        = cdrTrack.Trackfile.Offset,
-                        TrackFileType          = cdrTrack.Trackfile.Filetype,
-                        TrackRawBytesPerSector = cdrTrack.Bps,
-                        TrackBytesPerSector    = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.Tracktype)
+                        Indexes             = cdrTrack.Indexes, TrackDescription = cdrTrack.Title,
+                        TrackStartSector    = previousStartSector, TrackPregap   = cdrTrack.Pregap,
+                        TrackSession        = cdrTrack.Session, TrackSequence    = cdrTrack.Sequence,
+                        TrackType           = CdrWinTrackTypeToTrackType(cdrTrack.TrackType),
+                        TrackFile           = cdrTrack.TrackFile.DataFilter.GetFilename(),
+                        TrackFilter         = cdrTrack.TrackFile.DataFilter,
+                        TrackFileOffset     = cdrTrack.TrackFile.Offset,
+                        TrackFileType       = cdrTrack.TrackFile.FileType, TrackRawBytesPerSector = cdrTrack.Bps,
+                        TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.TrackType)
                     };
-                    dicTrack.TrackEndSector = dicTrack.TrackStartSector + cdrTrack.Sectors - 1;
+
+                    dicTrack.TrackEndSector = (dicTrack.TrackStartSector + cdrTrack.Sectors) - 1;
 
                     /*if(!cdrTrack.Indexes.TryGetValue(0, out dicTrack.TrackStartSector))
                         cdrTrack.Indexes.TryGetValue(1, out dicTrack.TrackStartSector);*/
-                    if(cdrTrack.Tracktype == CDRWIN_TRACK_TYPE_CDG)
+                    if(cdrTrack.TrackType == CDRWIN_TRACK_TYPE_CDG)
                     {
-                        dicTrack.TrackSubchannelFilter = cdrTrack.Trackfile.Datafilter;
-                        dicTrack.TrackSubchannelFile   = cdrTrack.Trackfile.Datafilter.GetFilename();
-                        dicTrack.TrackSubchannelOffset = cdrTrack.Trackfile.Offset;
+                        dicTrack.TrackSubchannelFilter = cdrTrack.TrackFile.DataFilter;
+                        dicTrack.TrackSubchannelFile   = cdrTrack.TrackFile.DataFilter.GetFilename();
+                        dicTrack.TrackSubchannelOffset = cdrTrack.TrackFile.Offset;
                         dicTrack.TrackSubchannelType   = TrackSubchannelType.RawInterleaved;
                     }
-                    else dicTrack.TrackSubchannelType = TrackSubchannelType.None;
+                    else
+                        dicTrack.TrackSubchannelType = TrackSubchannelType.None;
 
                     tracks.Add(dicTrack);
                     previousStartSector = dicTrack.TrackEndSector + 1;
@@ -93,40 +92,46 @@ namespace DiscImageChef.DiscImages
                 return tracks;
             }
         }
-        public List             Sessions           => discimage.Sessions;
-        public List    DumpHardware       => null;
-        public CICMMetadataType          CicmMetadata       => null;
-        public IEnumerable SupportedMediaTags => new[] {MediaTagType.CD_MCN, MediaTagType.CD_TEXT};
-        public IEnumerable SupportedSectorTags =>
-            new[]
-            {
-                SectorTagType.CdSectorEcc, SectorTagType.CdSectorEccP, SectorTagType.CdSectorEccQ,
-                SectorTagType.CdSectorEdc, SectorTagType.CdSectorHeader, SectorTagType.CdSectorSubHeader,
-                SectorTagType.CdSectorSync, SectorTagType.CdTrackFlags, SectorTagType.CdTrackIsrc
-            };
-        public IEnumerable SupportedMediaTypes =>
-            new[]
-            {
-                MediaType.BDR, MediaType.BDRE, MediaType.BDREXL, MediaType.BDROM, MediaType.BDRXL, MediaType.CBHD,
-                MediaType.CD, MediaType.CDDA, MediaType.CDEG, MediaType.CDG, MediaType.CDI, MediaType.CDMIDI,
-                MediaType.CDMRW, MediaType.CDPLUS, MediaType.CDR, MediaType.CDROM, MediaType.CDROMXA,
-                MediaType.CDRW, MediaType.CDV, MediaType.DDCD, MediaType.DDCDR, MediaType.DDCDRW,
-                MediaType.DVDDownload, MediaType.DVDPR, MediaType.DVDPRDL, MediaType.DVDPRW, MediaType.DVDPRWDL,
-                MediaType.DVDR, MediaType.DVDRAM, MediaType.DVDRDL, MediaType.DVDROM, MediaType.DVDRW,
-                MediaType.DVDRWDL, MediaType.EVD, MediaType.FDDVD, MediaType.DTSCD, MediaType.FVD, MediaType.HDDVDR,
-                MediaType.HDDVDRAM, MediaType.HDDVDRDL, MediaType.HDDVDROM, MediaType.HDDVDRW, MediaType.HDDVDRWDL,
-                MediaType.HDVMD, MediaType.HVD, MediaType.JaguarCD, MediaType.MEGACD, MediaType.PS1CD,
-                MediaType.PS2CD, MediaType.PS2DVD, MediaType.PS3BD, MediaType.PS3DVD, MediaType.PS4BD,
-                MediaType.SuperCDROM2, MediaType.SVCD, MediaType.SVOD, MediaType.SATURNCD, MediaType.ThreeDO,
-                MediaType.UDO, MediaType.UDO2, MediaType.UDO2_WORM, MediaType.UMD, MediaType.VCD, MediaType.VCDHD,
-                MediaType.NeoGeoCD, MediaType.PCFX, MediaType.CDTV, MediaType.CD32, MediaType.Nuon,
-                MediaType.Playdia, MediaType.Pippin, MediaType.FMTOWNS, MediaType.MilCD, MediaType.VideoNow,
-                MediaType.VideoNowColor, MediaType.VideoNowXp
-            };
-        public IEnumerable<(string name, Type type, string description, object @default)> SupportedOptions =>
-            new[] {("separate", typeof(bool), "Write each track to a separate file.", (object)false)};
-        public IEnumerable KnownExtensions => new[] {".cue"};
-        public bool                IsWriting       { get; private set; }
-        public string              ErrorMessage    { get; private set; }
+
+        public List          Sessions     => _discImage.Sessions;
+        public List DumpHardware { get; private set; }
+        public CICMMetadataType       CicmMetadata => null;
+        public IEnumerable SupportedMediaTags => new[]
+        {
+            MediaTagType.CD_MCN, MediaTagType.CD_TEXT
+        };
+        public IEnumerable SupportedSectorTags => new[]
+        {
+            SectorTagType.CdSectorEcc, SectorTagType.CdSectorEccP, SectorTagType.CdSectorEccQ,
+            SectorTagType.CdSectorEdc, SectorTagType.CdSectorHeader, SectorTagType.CdSectorSubHeader,
+            SectorTagType.CdSectorSync, SectorTagType.CdTrackFlags, SectorTagType.CdTrackIsrc
+        };
+        public IEnumerable SupportedMediaTypes => new[]
+        {
+            MediaType.BDR, MediaType.BDRE, MediaType.BDREXL, MediaType.BDROM, MediaType.BDRXL, MediaType.CBHD,
+            MediaType.CD, MediaType.CDDA, MediaType.CDEG, MediaType.CDG, MediaType.CDI, MediaType.CDMIDI,
+            MediaType.CDMRW, MediaType.CDPLUS, MediaType.CDR, MediaType.CDROM, MediaType.CDROMXA, MediaType.CDRW,
+            MediaType.CDV, MediaType.DDCD, MediaType.DDCDR, MediaType.DDCDRW, MediaType.DVDDownload, MediaType.DVDPR,
+            MediaType.DVDPRDL, MediaType.DVDPRW, MediaType.DVDPRWDL, MediaType.DVDR, MediaType.DVDRAM, MediaType.DVDRDL,
+            MediaType.DVDROM, MediaType.DVDRW, MediaType.DVDRWDL, MediaType.EVD, MediaType.FDDVD, MediaType.DTSCD,
+            MediaType.FVD, MediaType.HDDVDR, MediaType.HDDVDRAM, MediaType.HDDVDRDL, MediaType.HDDVDROM,
+            MediaType.HDDVDRW, MediaType.HDDVDRWDL, MediaType.HDVMD, MediaType.HVD, MediaType.JaguarCD,
+            MediaType.MEGACD, MediaType.PS1CD, MediaType.PS2CD, MediaType.PS2DVD, MediaType.PS3BD, MediaType.PS3DVD,
+            MediaType.PS4BD, MediaType.SuperCDROM2, MediaType.SVCD, MediaType.SVOD, MediaType.SATURNCD,
+            MediaType.ThreeDO, MediaType.UDO, MediaType.UDO2, MediaType.UDO2_WORM, MediaType.UMD, MediaType.VCD,
+            MediaType.VCDHD, MediaType.NeoGeoCD, MediaType.PCFX, MediaType.CDTV, MediaType.CD32, MediaType.Nuon,
+            MediaType.Playdia, MediaType.Pippin, MediaType.FMTOWNS, MediaType.MilCD, MediaType.VideoNow,
+            MediaType.VideoNowColor, MediaType.VideoNowXp
+        };
+        public IEnumerable<(string name, Type type, string description, object @default)> SupportedOptions => new[]
+        {
+            ("separate", typeof(bool), "Write each track to a separate file.", (object)false)
+        };
+        public IEnumerable KnownExtensions => new[]
+        {
+            ".cue"
+        };
+        public bool   IsWriting    { get; private set; }
+        public string ErrorMessage { get; private set; }
     }
 }
\ No newline at end of file
diff --git a/DiscImageChef.DiscImages/CDRWin/Read.cs b/DiscImageChef.DiscImages/CDRWin/Read.cs
index eb25efbc2..31b5c372f 100644
--- a/DiscImageChef.DiscImages/CDRWin/Read.cs
+++ b/DiscImageChef.DiscImages/CDRWin/Read.cs
@@ -42,6 +42,7 @@ using DiscImageChef.CommonTypes.Exceptions;
 using DiscImageChef.CommonTypes.Interfaces;
 using DiscImageChef.CommonTypes.Structs;
 using DiscImageChef.Console;
+using Schemas;
 
 namespace DiscImageChef.DiscImages
 {
@@ -52,15 +53,15 @@ namespace DiscImageChef.DiscImages
             if(imageFilter == null)
                 return false;
 
-            cdrwinFilter = imageFilter;
+            _cdrwinFilter = imageFilter;
 
             try
             {
                 imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
-                cueStream = new StreamReader(imageFilter.GetDataForkStream());
+                _cueStream = new StreamReader(imageFilter.GetDataForkStream());
                 int  lineNumber     = 0;
-                bool intrack        = false;
-                byte currentsession = 1;
+                bool inTrack        = false;
+                byte currentSession = 1;
 
                 // Initialize all RegExs
                 var regexSession                = new Regex(REGEX_SESSION);
@@ -95,31 +96,34 @@ namespace DiscImageChef.DiscImages
                 var regexTruripTrackMd5         = new Regex(REGEX_TRURIP_TRACK_MD5);
                 var regexTruripTrackSha1        = new Regex(REGEX_TRURIP_TRACK_SHA1);
                 var regexTruripTrackUnknownHash = new Regex(REGEX_TRURIP_TRACK_UNKNOWN);
+                var regexDicMediaType           = new Regex(REGEX_DIC_MEDIA_TYPE);
+                var regexApplicationVersion     = new Regex(REGEX_APPLICATION_VERSION);
+                var regexDumpExtent             = new Regex(REGEX_DUMP_EXTENT);
 
                 // Initialize all RegEx matches
                 Match matchTrack;
 
                 // Initialize disc
-                discimage = new CdrWinDisc
+                _discImage = new CdrWinDisc
                 {
                     Sessions   = new List(), Tracks = new List(), Comment = "",
                     DiscHashes = new Dictionary()
                 };
 
-                var currenttrack = new CdrWinTrack
+                var currentTrack = new CdrWinTrack
                 {
                     Indexes = new Dictionary()
                 };
 
-                var   currentfile             = new CdrWinTrackFile();
-                ulong currentfileoffsetsector = 0;
+                var   currentFile             = new CdrWinTrackFile();
+                ulong currentFileOffsetSector = 0;
 
                 int trackCount = 0;
 
-                while(cueStream.Peek() >= 0)
+                while(_cueStream.Peek() >= 0)
                 {
                     lineNumber++;
-                    string line = cueStream.ReadLine();
+                    string line = _cueStream.ReadLine();
 
                     matchTrack = regexTrack.Match(line);
 
@@ -138,29 +142,32 @@ namespace DiscImageChef.DiscImages
                 if(trackCount == 0)
                     throw new FeatureUnsupportedImageException("No tracks found");
 
-                CdrWinTrack[] cuetracks = new CdrWinTrack[trackCount];
+                CdrWinTrack[] cueTracks = new CdrWinTrack[trackCount];
 
                 lineNumber = 0;
                 imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
-                cueStream = new StreamReader(imageFilter.GetDataForkStream());
+                _cueStream = new StreamReader(imageFilter.GetDataForkStream());
 
                 var  filtersList       = new FiltersList();
                 bool inTruripDiscHash  = false;
                 bool inTruripTrackHash = false;
 
-                while(cueStream.Peek() >= 0)
+                while(_cueStream.Peek() >= 0)
                 {
                     lineNumber++;
-                    string line = cueStream.ReadLine();
+                    string line = _cueStream.ReadLine();
 
-                    Match matchSession     = regexSession.Match(line);
-                    Match matchDiskType    = regexDiskType.Match(line);
-                    Match matchComment     = regexComment.Match(line);
-                    Match matchLba         = regexLba.Match(line);
-                    Match matchLeadOut     = regexLeadOut.Match(line);
-                    Match matchApplication = regexApplication.Match(line);
-                    Match matchTruripDisc  = regexTruripDisc.Match(line);
-                    Match matchTruripTrack = regexTruripTrack.Match(line);
+                    Match matchSession            = regexSession.Match(line);
+                    Match matchDiskType           = regexDiskType.Match(line);
+                    Match matchComment            = regexComment.Match(line);
+                    Match matchLba                = regexLba.Match(line);
+                    Match matchLeadOut            = regexLeadOut.Match(line);
+                    Match matchApplication        = regexApplication.Match(line);
+                    Match matchTruripDisc         = regexTruripDisc.Match(line);
+                    Match matchTruripTrack        = regexTruripTrack.Match(line);
+                    Match matchDicMediaType       = regexDicMediaType.Match(line);
+                    Match matchApplicationVersion = regexApplicationVersion.Match(line);
+                    Match matchDumpExtent         = regexDumpExtent.Match(line);
 
                     if(inTruripDiscHash)
                     {
@@ -171,7 +178,7 @@ namespace DiscImageChef.DiscImages
                         if(matchTruripDiscCrc32.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found REM CRC32 at line {0}", lineNumber);
-                            discimage.DiscHashes.Add("crc32", matchTruripDiscCrc32.Groups[1].Value.ToLowerInvariant());
+                            _discImage.DiscHashes.Add("crc32", matchTruripDiscCrc32.Groups[1].Value.ToLowerInvariant());
 
                             continue;
                         }
@@ -179,7 +186,7 @@ namespace DiscImageChef.DiscImages
                         if(matchTruripDiscMd5.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found REM MD5 at line {0}", lineNumber);
-                            discimage.DiscHashes.Add("md5", matchTruripDiscMd5.Groups[1].Value.ToLowerInvariant());
+                            _discImage.DiscHashes.Add("md5", matchTruripDiscMd5.Groups[1].Value.ToLowerInvariant());
 
                             continue;
                         }
@@ -187,7 +194,7 @@ namespace DiscImageChef.DiscImages
                         if(matchTruripDiscSha1.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found REM SHA1 at line {0}", lineNumber);
-                            discimage.DiscHashes.Add("sha1", matchTruripDiscSha1.Groups[1].Value.ToLowerInvariant());
+                            _discImage.DiscHashes.Add("sha1", matchTruripDiscSha1.Groups[1].Value.ToLowerInvariant());
 
                             continue;
                         }
@@ -244,21 +251,84 @@ namespace DiscImageChef.DiscImages
                     inTruripDiscHash  = false;
                     inTruripTrackHash = false;
 
-                    if(matchDiskType.Success &&
-                       !intrack)
+                    if(matchDumpExtent.Success                                                      &&
+                       !inTrack                                                                     &&
+                       ulong.TryParse(matchDumpExtent.Groups["start"].Value, out ulong extentStart) &&
+                       ulong.TryParse(matchDumpExtent.Groups["end"].Value, out ulong extentEnd))
+                    {
+                        DicConsole.DebugWriteLine("CDRWin plugin", "Found REM METADATA DUMP EXTENT at line {0}",
+                                                  lineNumber);
+
+                        if(DumpHardware is null)
+                            DumpHardware = new List();
+
+                        DumpHardwareType existingDump =
+                            DumpHardware.FirstOrDefault(d =>
+                                                            d.Manufacturer == matchDumpExtent.
+                                                                              Groups["manufacturer"].Value         &&
+                                                            d.Model    == matchDumpExtent.Groups["model"].Value    &&
+                                                            d.Firmware == matchDumpExtent.Groups["firmware"].Value &&
+                                                            d.Serial   == matchDumpExtent.Groups["serial"].Value   &&
+                                                            d.Software.Name ==
+                                                            matchDumpExtent.Groups["application"].Value &&
+                                                            d.Software.Version == matchDumpExtent.
+                                                                                  Groups["version"].Value &&
+                                                            d.Software.OperatingSystem == matchDumpExtent.
+                                                                                          Groups["os"].Value);
+
+                        if(existingDump is null)
+                        {
+                            DumpHardware.Add(new DumpHardwareType
+                            {
+                                Extents = new[]
+                                {
+                                    new ExtentType
+                                    {
+                                        Start = extentStart, End = extentEnd
+                                    }
+                                },
+                                Firmware     = matchDumpExtent.Groups["firmware"].Value,
+                                Manufacturer = matchDumpExtent.Groups["manufacturer"].Value,
+                                Model        = matchDumpExtent.Groups["model"].Value,
+                                Serial       = matchDumpExtent.Groups["serial"].Value, Software = new SoftwareType
+                                {
+                                    Name            = matchDumpExtent.Groups["application"].Value,
+                                    Version         = matchDumpExtent.Groups["version"].Value,
+                                    OperatingSystem = matchDumpExtent.Groups["os"].Value
+                                }
+                            });
+                        }
+                        else
+                        {
+                            existingDump.Extents = new List(existingDump.Extents)
+                            {
+                                new ExtentType
+                                {
+                                    Start = extentStart, End = extentEnd
+                                }
+                            }.OrderBy(e => e.Start).ToArray();
+                        }
+                    }
+                    else if(matchDicMediaType.Success &&
+                            !inTrack)
+                    {
+                        DicConsole.DebugWriteLine("CDRWin plugin", "Found REM METADATA DIC MEDIA-TYPE at line {0}",
+                                                  lineNumber);
+
+                        _discImage.DicMediaType = matchDicMediaType.Groups[1].Value;
+                    }
+                    else if(matchDiskType.Success &&
+                            !inTrack)
                     {
                         DicConsole.DebugWriteLine("CDRWin plugin", "Found REM ORIGINAL MEDIA TYPE at line {0}",
                                                   lineNumber);
 
-                        discimage.Disktypestr = matchDiskType.Groups[1].Value;
+                        _discImage.OriginalMediaType = matchDiskType.Groups[1].Value;
                     }
-                    else if(matchDiskType.Success && intrack)
-                        throw new
-                            FeatureUnsupportedImageException($"Found REM ORIGINAL MEDIA TYPE field after a track in line {lineNumber}");
                     else if(matchSession.Success)
                     {
                         DicConsole.DebugWriteLine("CDRWin plugin", "Found REM SESSION at line {0}", lineNumber);
-                        currentsession = byte.Parse(matchSession.Groups[1].Value);
+                        currentSession = byte.Parse(matchSession.Groups[1].Value);
 
                         // What happens between sessions
                     }
@@ -269,7 +339,15 @@ namespace DiscImageChef.DiscImages
                     else if(matchApplication.Success)
                     {
                         DicConsole.DebugWriteLine("CDRWin plugin", "Found REM Ripping Tool at line {0}", lineNumber);
-                        imageInfo.Application = matchApplication.Groups[1].Value;
+                        _imageInfo.Application = matchApplication.Groups[1].Value;
+                    }
+                    else if(matchApplicationVersion.Success &&
+                            !inTrack)
+                    {
+                        DicConsole.DebugWriteLine("CDRWin plugin", "Found REM Ripping Tool Version at line {0}",
+                                                  lineNumber);
+
+                        _imageInfo.ApplicationVersion = matchApplicationVersion.Groups[1].Value;
                     }
                     else if(matchTruripDisc.Success)
                     {
@@ -283,17 +361,17 @@ namespace DiscImageChef.DiscImages
                                                   lineNumber, matchTruripTrack.Groups[1].Value,
                                                   matchTruripTrack.Groups[2].Value);
 
-                        inTruripTrackHash  = true;
-                        discimage.IsTrurip = true;
+                        inTruripTrackHash   = true;
+                        _discImage.IsTrurip = true;
                     }
                     else if(matchComment.Success)
                     {
                         DicConsole.DebugWriteLine("CDRWin plugin", "Found REM at line {0}", lineNumber);
 
-                        if(discimage.Comment == "")
-                            discimage.Comment = matchComment.Groups[1].Value; // First comment
+                        if(_discImage.Comment == "")
+                            _discImage.Comment = matchComment.Groups[1].Value; // First comment
                         else
-                            discimage.Comment +=
+                            _discImage.Comment +=
                                 Environment.NewLine + matchComment.Groups[1].Value; // Append new comments as new lines
                     }
                     else
@@ -320,17 +398,17 @@ namespace DiscImageChef.DiscImages
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found ARRANGER at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Arranger = matchArranger.Groups[1].Value;
+                            if(inTrack)
+                                currentTrack.Arranger = matchArranger.Groups[1].Value;
                             else
-                                discimage.Arranger = matchArranger.Groups[1].Value;
+                                _discImage.Arranger = matchArranger.Groups[1].Value;
                         }
                         else if(matchBarCode.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found UPC_EAN at line {0}", lineNumber);
 
-                            if(!intrack)
-                                discimage.Barcode = matchBarCode.Groups[1].Value;
+                            if(!inTrack)
+                                _discImage.Barcode = matchBarCode.Groups[1].Value;
                             else
                                 throw new
                                     FeatureUnsupportedImageException($"Found barcode field in incorrect place at line {lineNumber}");
@@ -339,8 +417,8 @@ namespace DiscImageChef.DiscImages
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found CDTEXTFILE at line {0}", lineNumber);
 
-                            if(!intrack)
-                                discimage.Cdtextfile = matchCdText.Groups[1].Value;
+                            if(!inTrack)
+                                _discImage.CdTextFile = matchCdText.Groups[1].Value;
                             else
                                 throw new
                                     FeatureUnsupportedImageException($"Found CD-Text file field in incorrect place at line {lineNumber}");
@@ -349,17 +427,17 @@ namespace DiscImageChef.DiscImages
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found COMPOSER at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Composer = matchComposer.Groups[1].Value;
+                            if(inTrack)
+                                currentTrack.Composer = matchComposer.Groups[1].Value;
                             else
-                                discimage.Composer = matchComposer.Groups[1].Value;
+                                _discImage.Composer = matchComposer.Groups[1].Value;
                         }
                         else if(matchDiskId.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found DISC_ID at line {0}", lineNumber);
 
-                            if(!intrack)
-                                discimage.DiskId = matchDiskId.Groups[1].Value;
+                            if(!inTrack)
+                                _discImage.DiscId = matchDiskId.Groups[1].Value;
                             else
                                 throw new
                                     FeatureUnsupportedImageException($"Found CDDB ID field in incorrect place at line {lineNumber}");
@@ -368,53 +446,52 @@ namespace DiscImageChef.DiscImages
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found FILE at line {0}", lineNumber);
 
-                            if(currenttrack.Sequence != 0)
+                            if(currentTrack.Sequence != 0)
                             {
-                                currentfile.Sequence   = currenttrack.Sequence;
-                                currenttrack.Trackfile = currentfile;
+                                currentFile.Sequence   = currentTrack.Sequence;
+                                currentTrack.TrackFile = currentFile;
 
-                                currenttrack.Sectors =
-                                    ((ulong)currentfile.Datafilter.GetLength() - currentfile.Offset) /
-                                    CdrWinTrackTypeToBytesPerSector(currenttrack.Tracktype);
+                                currentTrack.Sectors =
+                                    ((ulong)currentFile.DataFilter.GetLength() - currentFile.Offset) /
+                                    CdrWinTrackTypeToBytesPerSector(currentTrack.TrackType);
 
-                                cuetracks[currenttrack.Sequence - 1] = currenttrack;
-                                intrack                              = false;
-                                currenttrack                         = new CdrWinTrack();
-                                currentfile                          = new CdrWinTrackFile();
+                                cueTracks[currentTrack.Sequence - 1] = currentTrack;
+                                inTrack                              = false;
+                                currentTrack                         = new CdrWinTrack();
+                                currentFile                          = new CdrWinTrackFile();
                                 filtersList                          = new FiltersList();
                             }
 
-                            //currentfile = new CDRWinTrackFile();
                             string datafile = matchFile.Groups[1].Value;
-                            currentfile.Filetype = matchFile.Groups[2].Value;
+                            currentFile.FileType = matchFile.Groups[2].Value;
 
                             // Check if file path is quoted
                             if(datafile[0]                   == '"' &&
                                datafile[datafile.Length - 1] == '"')
                                 datafile = datafile.Substring(1, datafile.Length - 2); // Unquote it
 
-                            currentfile.Datafilter = filtersList.GetFilter(datafile);
+                            currentFile.DataFilter = filtersList.GetFilter(datafile);
 
                             // Check if file exists
-                            if(currentfile.Datafilter == null)
+                            if(currentFile.DataFilter == null)
                                 if(datafile[0] == '/' ||
                                    (datafile[0] == '/' && datafile[1] == '.')) // UNIX absolute path
                                 {
-                                    var   unixpath      = new Regex("^(.+)/([^/]+)$");
-                                    Match unixpathmatch = unixpath.Match(datafile);
+                                    var   unixPath      = new Regex("^(.+)/([^/]+)$");
+                                    Match unixPathMatch = unixPath.Match(datafile);
 
-                                    if(unixpathmatch.Success)
+                                    if(unixPathMatch.Success)
                                     {
-                                        currentfile.Datafilter = filtersList.GetFilter(unixpathmatch.Groups[1].Value);
+                                        currentFile.DataFilter = filtersList.GetFilter(unixPathMatch.Groups[1].Value);
 
-                                        if(currentfile.Datafilter == null)
+                                        if(currentFile.DataFilter == null)
                                         {
                                             string path = imageFilter.GetParentFolder() + Path.PathSeparator +
-                                                          unixpathmatch.Groups[1].Value;
+                                                          unixPathMatch.Groups[1].Value;
 
-                                            currentfile.Datafilter = filtersList.GetFilter(path);
+                                            currentFile.DataFilter = filtersList.GetFilter(path);
 
-                                            if(currentfile.Datafilter == null)
+                                            if(currentFile.DataFilter == null)
                                                 throw new
                                                     FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
                                         }
@@ -427,24 +504,24 @@ namespace DiscImageChef.DiscImages
                                         (datafile[0] == '\\' && datafile[1] == '\\') ||
                                         (datafile[0] == '.'  && datafile[1] == '\\')) // Windows absolute path
                                 {
-                                    var winpath =
+                                    var winPath =
                                         new
                                             Regex("^(?:[a-zA-Z]\\:(\\\\|\\/)|file\\:\\/\\/|\\\\\\\\|\\.(\\/|\\\\))([^\\\\\\/\\:\\*\\?\\<\\>\\\"\\|]+(\\\\|\\/){0,1})+$");
 
-                                    Match winpathmatch = winpath.Match(datafile);
+                                    Match winPathMatch = winPath.Match(datafile);
 
-                                    if(winpathmatch.Success)
+                                    if(winPathMatch.Success)
                                     {
-                                        currentfile.Datafilter = filtersList.GetFilter(winpathmatch.Groups[1].Value);
+                                        currentFile.DataFilter = filtersList.GetFilter(winPathMatch.Groups[1].Value);
 
-                                        if(currentfile.Datafilter == null)
+                                        if(currentFile.DataFilter == null)
                                         {
                                             string path = imageFilter.GetParentFolder() + Path.PathSeparator +
-                                                          winpathmatch.Groups[1].Value;
+                                                          winPathMatch.Groups[1].Value;
 
-                                            currentfile.Datafilter = filtersList.GetFilter(path);
+                                            currentFile.DataFilter = filtersList.GetFilter(path);
 
-                                            if(currentfile.Datafilter == null)
+                                            if(currentFile.DataFilter == null)
                                                 throw new
                                                     FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
                                         }
@@ -456,18 +533,18 @@ namespace DiscImageChef.DiscImages
                                 else
                                 {
                                     string path = imageFilter.GetParentFolder() + Path.PathSeparator + datafile;
-                                    currentfile.Datafilter = filtersList.GetFilter(path);
+                                    currentFile.DataFilter = filtersList.GetFilter(path);
 
-                                    if(currentfile.Datafilter == null)
+                                    if(currentFile.DataFilter == null)
                                         throw new
                                             FeatureUnsupportedImageException($"File \"{matchFile.Groups[1].Value}\" not found.");
                                 }
 
                             // File does exist, process it
                             DicConsole.DebugWriteLine("CDRWin plugin", "File \"{0}\" found",
-                                                      currentfile.Datafilter.GetFilename());
+                                                      currentFile.DataFilter.GetFilename());
 
-                            switch(currentfile.Filetype)
+                            switch(currentFile.FileType)
                             {
                                 case CDRWIN_DISK_TYPE_LITTLE_ENDIAN: break;
                                 case CDRWIN_DISK_TYPE_BIG_ENDIAN:
@@ -475,103 +552,103 @@ namespace DiscImageChef.DiscImages
                                 case CDRWIN_DISK_TYPE_RIFF:
                                 case CDRWIN_DISK_TYPE_MP3:
                                     throw new
-                                        FeatureSupportedButNotImplementedImageException($"Unsupported file type {currentfile.Filetype}");
+                                        FeatureSupportedButNotImplementedImageException($"Unsupported file type {currentFile.FileType}");
                                 default:
                                     throw new
-                                        FeatureUnsupportedImageException($"Unknown file type {currentfile.Filetype}");
+                                        FeatureUnsupportedImageException($"Unknown file type {currentFile.FileType}");
                             }
 
-                            currentfile.Offset   = 0;
-                            currentfile.Sequence = 0;
+                            currentFile.Offset   = 0;
+                            currentFile.Sequence = 0;
                         }
                         else if(matchFlags.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found FLAGS at line {0}", lineNumber);
 
-                            if(!intrack)
+                            if(!inTrack)
                                 throw new
                                     FeatureUnsupportedImageException($"Found FLAGS field in incorrect place at line {lineNumber}");
 
-                            currenttrack.FlagDcp  |= matchFlags.Groups["dcp"].Value  == "DCP";
-                            currenttrack.Flag4ch  |= matchFlags.Groups["quad"].Value == "4CH";
-                            currenttrack.FlagPre  |= matchFlags.Groups["pre"].Value  == "PRE";
-                            currenttrack.FlagScms |= matchFlags.Groups["scms"].Value == "SCMS";
+                            currentTrack.FlagDcp  |= matchFlags.Groups["dcp"].Value  == "DCP";
+                            currentTrack.Flag4ch  |= matchFlags.Groups["quad"].Value == "4CH";
+                            currentTrack.FlagPre  |= matchFlags.Groups["pre"].Value  == "PRE";
+                            currentTrack.FlagScms |= matchFlags.Groups["scms"].Value == "SCMS";
                         }
                         else if(matchGenre.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found GENRE at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Genre = matchGenre.Groups[1].Value;
+                            if(inTrack)
+                                currentTrack.Genre = matchGenre.Groups[1].Value;
                             else
-                                discimage.Genre = matchGenre.Groups[1].Value;
+                                _discImage.Genre = matchGenre.Groups[1].Value;
                         }
                         else if(matchIndex.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found INDEX at line {0}", lineNumber);
 
-                            if(!intrack)
+                            if(!inTrack)
                                 throw new FeatureUnsupportedImageException($"Found INDEX before a track {lineNumber}");
 
                             int   index  = int.Parse(matchIndex.Groups[1].Value);
-                            ulong offset = CdrWinMsftoLba(matchIndex.Groups[2].Value);
+                            ulong offset = CdrWinMsfToLba(matchIndex.Groups[2].Value);
 
                             if(index                      != 0 &&
                                index                      != 1 &&
-                               currenttrack.Indexes.Count == 0)
+                               currentTrack.Indexes.Count == 0)
                                 throw new
                                     FeatureUnsupportedImageException($"Found INDEX {index} before INDEX 00 or INDEX 01");
 
                             if(index == 0 ||
-                               (index == 1 && !currenttrack.Indexes.ContainsKey(0)))
-                                if((int)(currenttrack.Sequence - 2) >= 0 &&
+                               (index == 1 && !currentTrack.Indexes.ContainsKey(0)))
+                                if((int)(currentTrack.Sequence - 2) >= 0 &&
                                    offset                           > 1)
                                 {
-                                    cuetracks[currenttrack.Sequence - 2].Sectors = offset - currentfileoffsetsector;
+                                    cueTracks[currentTrack.Sequence - 2].Sectors = offset - currentFileOffsetSector;
 
-                                    currentfile.Offset +=
-                                        cuetracks[currenttrack.Sequence - 2].Sectors *
-                                        cuetracks[currenttrack.Sequence - 2].Bps;
+                                    currentFile.Offset +=
+                                        cueTracks[currentTrack.Sequence - 2].Sectors *
+                                        cueTracks[currentTrack.Sequence - 2].Bps;
 
-                                    DicConsole.DebugWriteLine("CDRWin plugin", "Sets currentfile.offset to {0}",
-                                                              currentfile.Offset);
+                                    DicConsole.DebugWriteLine("CDRWin plugin", "Sets currentFile.offset to {0}",
+                                                              currentFile.Offset);
 
                                     DicConsole.DebugWriteLine("CDRWin plugin",
-                                                              "cuetracks[currenttrack.sequence-2].sectors = {0}",
-                                                              cuetracks[currenttrack.Sequence - 2].Sectors);
+                                                              "cueTracks[currentTrack.sequence-2].sectors = {0}",
+                                                              cueTracks[currentTrack.Sequence - 2].Sectors);
 
                                     DicConsole.DebugWriteLine("CDRWin plugin",
-                                                              "cuetracks[currenttrack.sequence-2].bps = {0}",
-                                                              cuetracks[currenttrack.Sequence - 2].Bps);
+                                                              "cueTracks[currentTrack.sequence-2].bps = {0}",
+                                                              cueTracks[currentTrack.Sequence - 2].Bps);
                                 }
 
-                            if((index == 0 || (index == 1 && !currenttrack.Indexes.ContainsKey(0))) &&
-                               currenttrack.Sequence == 1)
+                            if((index == 0 || (index == 1 && !currentTrack.Indexes.ContainsKey(0))) &&
+                               currentTrack.Sequence == 1)
                             {
-                                DicConsole.DebugWriteLine("CDRWin plugin", "Sets currentfile.offset to {0}",
-                                                          offset * currenttrack.Bps);
+                                DicConsole.DebugWriteLine("CDRWin plugin", "Sets currentFile.offset to {0}",
+                                                          offset * currentTrack.Bps);
 
-                                currentfile.Offset = offset * currenttrack.Bps;
+                                currentFile.Offset = offset * currentTrack.Bps;
                             }
 
-                            currentfileoffsetsector = offset;
-                            currenttrack.Indexes.Add(index, offset);
+                            currentFileOffsetSector = offset;
+                            currentTrack.Indexes.Add(index, offset);
                         }
                         else if(matchIsrc.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found ISRC at line {0}", lineNumber);
 
-                            if(!intrack)
+                            if(!inTrack)
                                 throw new FeatureUnsupportedImageException($"Found ISRC before a track {lineNumber}");
 
-                            currenttrack.Isrc = matchIsrc.Groups[1].Value;
+                            currentTrack.Isrc = matchIsrc.Groups[1].Value;
                         }
                         else if(matchMcn.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found CATALOG at line {0}", lineNumber);
 
-                            if(!intrack)
-                                discimage.Mcn = matchMcn.Groups[1].Value;
+                            if(!inTrack)
+                                _discImage.Mcn = matchMcn.Groups[1].Value;
                             else
                                 throw new
                                     FeatureUnsupportedImageException($"Found CATALOG field in incorrect place at line {lineNumber}");
@@ -580,17 +657,17 @@ namespace DiscImageChef.DiscImages
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found PERFORMER at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Performer = matchPerformer.Groups[1].Value;
+                            if(inTrack)
+                                currentTrack.Performer = matchPerformer.Groups[1].Value;
                             else
-                                discimage.Performer = matchPerformer.Groups[1].Value;
+                                _discImage.Performer = matchPerformer.Groups[1].Value;
                         }
                         else if(matchPostgap.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found POSTGAP at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Postgap = CdrWinMsftoLba(matchPostgap.Groups[1].Value);
+                            if(inTrack)
+                                currentTrack.Postgap = CdrWinMsfToLba(matchPostgap.Groups[1].Value);
                             else
                                 throw new
                                     FeatureUnsupportedImageException($"Found POSTGAP field before a track at line {lineNumber}");
@@ -599,8 +676,8 @@ namespace DiscImageChef.DiscImages
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found PREGAP at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Pregap = CdrWinMsftoLba(matchPregap.Groups[1].Value);
+                            if(inTrack)
+                                currentTrack.Pregap = CdrWinMsfToLba(matchPregap.Groups[1].Value);
                             else
                                 throw new
                                     FeatureUnsupportedImageException($"Found PREGAP field before a track at line {lineNumber}");
@@ -609,53 +686,53 @@ namespace DiscImageChef.DiscImages
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found SONGWRITER at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Songwriter = matchSongWriter.Groups[1].Value;
+                            if(inTrack)
+                                currentTrack.Songwriter = matchSongWriter.Groups[1].Value;
                             else
-                                discimage.Songwriter = matchSongWriter.Groups[1].Value;
+                                _discImage.Songwriter = matchSongWriter.Groups[1].Value;
                         }
                         else if(matchTitle.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found TITLE at line {0}", lineNumber);
 
-                            if(intrack)
-                                currenttrack.Title = matchTitle.Groups[1].Value;
+                            if(inTrack)
+                                currentTrack.Title = matchTitle.Groups[1].Value;
                             else
-                                discimage.Title = matchTitle.Groups[1].Value;
+                                _discImage.Title = matchTitle.Groups[1].Value;
                         }
                         else if(matchTrack.Success)
                         {
                             DicConsole.DebugWriteLine("CDRWin plugin", "Found TRACK at line {0}", lineNumber);
 
-                            if(currentfile.Datafilter == null)
+                            if(currentFile.DataFilter == null)
                                 throw new
                                     FeatureUnsupportedImageException($"Found TRACK field before a file is defined at line {lineNumber}");
 
-                            if(intrack)
+                            if(inTrack)
                             {
-                                if(currenttrack.Indexes.ContainsKey(0) &&
-                                   currenttrack.Pregap == 0)
-                                    currenttrack.Indexes.TryGetValue(0, out currenttrack.Pregap);
+                                if(currentTrack.Indexes.ContainsKey(0) &&
+                                   currentTrack.Pregap == 0)
+                                    currentTrack.Indexes.TryGetValue(0, out currentTrack.Pregap);
 
-                                currentfile.Sequence                 = currenttrack.Sequence;
-                                currenttrack.Trackfile               = currentfile;
-                                cuetracks[currenttrack.Sequence - 1] = currenttrack;
+                                currentFile.Sequence                 = currentTrack.Sequence;
+                                currentTrack.TrackFile               = currentFile;
+                                cueTracks[currentTrack.Sequence - 1] = currentTrack;
                             }
 
-                            currenttrack = new CdrWinTrack
+                            currentTrack = new CdrWinTrack
                             {
                                 Indexes  = new Dictionary(),
                                 Sequence = uint.Parse(matchTrack.Groups[1].Value)
                             };
 
-                            DicConsole.DebugWriteLine("CDRWin plugin", "Setting currenttrack.sequence to {0}",
-                                                      currenttrack.Sequence);
+                            DicConsole.DebugWriteLine("CDRWin plugin", "Setting currentTrack.sequence to {0}",
+                                                      currentTrack.Sequence);
 
-                            currentfile.Sequence   = currenttrack.Sequence;
-                            currenttrack.Bps       = CdrWinTrackTypeToBytesPerSector(matchTrack.Groups[2].Value);
-                            currenttrack.Tracktype = matchTrack.Groups[2].Value;
-                            currenttrack.Session   = currentsession;
-                            intrack                = true;
+                            currentFile.Sequence   = currentTrack.Sequence;
+                            currentTrack.Bps       = CdrWinTrackTypeToBytesPerSector(matchTrack.Groups[2].Value);
+                            currentTrack.TrackType = matchTrack.Groups[2].Value;
+                            currentTrack.Session   = currentSession;
+                            inTrack                = true;
                         }
                         else if(line == "") // Empty line, ignore it
                         { }
@@ -665,18 +742,18 @@ namespace DiscImageChef.DiscImages
                     }
                 }
 
-                if(currenttrack.Sequence != 0)
+                if(currentTrack.Sequence != 0)
                 {
-                    currentfile.Sequence   = currenttrack.Sequence;
-                    currenttrack.Trackfile = currentfile;
+                    currentFile.Sequence   = currentTrack.Sequence;
+                    currentTrack.TrackFile = currentFile;
 
-                    currenttrack.Sectors = ((ulong)currentfile.Datafilter.GetLength() - currentfile.Offset) /
-                                           CdrWinTrackTypeToBytesPerSector(currenttrack.Tracktype);
+                    currentTrack.Sectors = ((ulong)currentFile.DataFilter.GetLength() - currentFile.Offset) /
+                                           CdrWinTrackTypeToBytesPerSector(currentTrack.TrackType);
 
-                    cuetracks[currenttrack.Sequence - 1] = currenttrack;
+                    cueTracks[currentTrack.Sequence - 1] = currentTrack;
                 }
 
-                Session[] sessions = new Session[currentsession];
+                Session[] sessions = new Session[currentSession];
 
                 for(int s = 1; s <= sessions.Length; s++)
                 {
@@ -690,59 +767,65 @@ namespace DiscImageChef.DiscImages
                     ulong sessionSectors   = 0;
                     int   lastSessionTrack = 0;
 
-                    for(int i = 0; i < cuetracks.Length; i++)
-                        if(cuetracks[i].Session == s)
+                    for(int i = 0; i < cueTracks.Length; i++)
+                        if(cueTracks[i].Session == s)
                         {
-                            sessionSectors += cuetracks[i].Sectors;
+                            sessionSectors += cueTracks[i].Sectors;
 
                             if(i > lastSessionTrack)
                                 lastSessionTrack = i;
                         }
 
-                    sessions[s - 1].EndTrack  = cuetracks[lastSessionTrack].Sequence;
+                    sessions[s - 1].EndTrack  = cueTracks[lastSessionTrack].Sequence;
                     sessions[s - 1].EndSector = sessionSectors - 1;
                 }
 
                 for(int s = 1; s <= sessions.Length; s++)
-                    discimage.Sessions.Add(sessions[s - 1]);
+                    _discImage.Sessions.Add(sessions[s - 1]);
 
-                for(int t = 1; t <= cuetracks.Length; t++)
+                for(int t = 1; t <= cueTracks.Length; t++)
                 {
-                    if(cuetracks[t - 1].Indexes.TryGetValue(0, out ulong idx0) &&
-                       cuetracks[t - 1].Indexes.TryGetValue(1, out ulong idx1))
-                        cuetracks[t - 1].Pregap = idx1 - idx0;
+                    if(cueTracks[t - 1].Indexes.TryGetValue(0, out ulong idx0) &&
+                       cueTracks[t - 1].Indexes.TryGetValue(1, out ulong idx1))
+                        cueTracks[t - 1].Pregap = idx1 - idx0;
 
-                    discimage.Tracks.Add(cuetracks[t - 1]);
+                    _discImage.Tracks.Add(cueTracks[t - 1]);
                 }
 
-                discimage.Disktype = CdrWinIsoBusterDiscTypeToMediaType(discimage.Disktypestr);
+                if(!string.IsNullOrWhiteSpace(_discImage.DicMediaType) &&
+                   Enum.TryParse(_discImage.DicMediaType, true, out MediaType mediaType))
+                {
+                    _discImage.MediaType = mediaType;
+                }
+                else
+                    _discImage.MediaType = CdrWinIsoBusterDiscTypeToMediaType(_discImage.OriginalMediaType);
 
-                if(discimage.Disktype == MediaType.Unknown ||
-                   discimage.Disktype == MediaType.CD)
+                if(_discImage.MediaType == MediaType.Unknown ||
+                   _discImage.MediaType == MediaType.CD)
                 {
                     bool data       = false;
                     bool cdg        = false;
                     bool cdi        = false;
                     bool mode2      = false;
-                    bool firstaudio = false;
-                    bool firstdata  = false;
+                    bool firstAudio = false;
+                    bool firstData  = false;
                     bool audio      = false;
 
-                    for(int i = 0; i < discimage.Tracks.Count; i++)
+                    for(int i = 0; i < _discImage.Tracks.Count; i++)
                     {
                         // First track is audio
-                        firstaudio |= i == 0 && discimage.Tracks[i].Tracktype == CDRWIN_TRACK_TYPE_AUDIO;
+                        firstAudio |= i == 0 && _discImage.Tracks[i].TrackType == CDRWIN_TRACK_TYPE_AUDIO;
 
                         // First track is data
-                        firstdata |= i == 0 && discimage.Tracks[i].Tracktype != CDRWIN_TRACK_TYPE_AUDIO;
+                        firstData |= i == 0 && _discImage.Tracks[i].TrackType != CDRWIN_TRACK_TYPE_AUDIO;
 
                         // Any non first track is data
-                        data |= i != 0 && discimage.Tracks[i].Tracktype != CDRWIN_TRACK_TYPE_AUDIO;
+                        data |= i != 0 && _discImage.Tracks[i].TrackType != CDRWIN_TRACK_TYPE_AUDIO;
 
                         // Any non first track is audio
-                        audio |= i != 0 && discimage.Tracks[i].Tracktype == CDRWIN_TRACK_TYPE_AUDIO;
+                        audio |= i != 0 && _discImage.Tracks[i].TrackType == CDRWIN_TRACK_TYPE_AUDIO;
 
-                        switch(discimage.Tracks[i].Tracktype)
+                        switch(_discImage.Tracks[i].TrackType)
                         {
                             case CDRWIN_TRACK_TYPE_CDG:
                                 cdg = true;
@@ -764,184 +847,189 @@ namespace DiscImageChef.DiscImages
                     }
 
                     if(!data &&
-                       !firstdata)
-                        discimage.Disktype = MediaType.CDDA;
+                       !firstData)
+                        _discImage.MediaType = MediaType.CDDA;
                     else if(cdg)
-                        discimage.Disktype = MediaType.CDG;
+                        _discImage.MediaType = MediaType.CDG;
                     else if(cdi)
-                        discimage.Disktype = MediaType.CDI;
-                    else if(firstaudio                   &&
-                            data                         &&
-                            discimage.Sessions.Count > 1 &&
+                        _discImage.MediaType = MediaType.CDI;
+                    else if(firstAudio                    &&
+                            data                          &&
+                            _discImage.Sessions.Count > 1 &&
                             mode2)
-                        discimage.Disktype = MediaType.CDPLUS;
-                    else if((firstdata && audio) || mode2)
-                        discimage.Disktype = MediaType.CDROMXA;
+                        _discImage.MediaType = MediaType.CDPLUS;
+                    else if((firstData && audio) || mode2)
+                        _discImage.MediaType = MediaType.CDROMXA;
                     else if(!audio)
-                        discimage.Disktype = MediaType.CDROM;
+                        _discImage.MediaType = MediaType.CDROM;
                     else
-                        discimage.Disktype = MediaType.CD;
+                        _discImage.MediaType = MediaType.CD;
                 }
 
                 // DEBUG information
                 DicConsole.DebugWriteLine("CDRWin plugin", "Disc image parsing results");
                 DicConsole.DebugWriteLine("CDRWin plugin", "Disc CD-TEXT:");
 
-                if(discimage.Arranger == null)
+                if(_discImage.Arranger == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tArranger is not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tArranger: {0}", discimage.Arranger);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tArranger: {0}", _discImage.Arranger);
 
-                if(discimage.Composer == null)
+                if(_discImage.Composer == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tComposer is not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tComposer: {0}", discimage.Composer);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tComposer: {0}", _discImage.Composer);
 
-                if(discimage.Genre == null)
+                if(_discImage.Genre == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tGenre is not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tGenre: {0}", discimage.Genre);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tGenre: {0}", _discImage.Genre);
 
-                if(discimage.Performer == null)
+                if(_discImage.Performer == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tPerformer is not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tPerformer: {0}", discimage.Performer);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tPerformer: {0}", _discImage.Performer);
 
-                if(discimage.Songwriter == null)
+                if(_discImage.Songwriter == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tSongwriter is not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tSongwriter: {0}", discimage.Songwriter);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tSongwriter: {0}", _discImage.Songwriter);
 
-                if(discimage.Title == null)
+                if(_discImage.Title == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tTitle is not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tTitle: {0}", discimage.Title);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tTitle: {0}", _discImage.Title);
 
-                if(discimage.Cdtextfile == null)
+                if(_discImage.CdTextFile == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tCD-TEXT binary file not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tCD-TEXT binary file: {0}", discimage.Cdtextfile);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tCD-TEXT binary file: {0}", _discImage.CdTextFile);
 
                 DicConsole.DebugWriteLine("CDRWin plugin", "Disc information:");
 
-                if(discimage.Disktypestr == null)
+                if(_discImage.OriginalMediaType == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tISOBuster disc type not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tISOBuster disc type: {0}", discimage.Disktypestr);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tISOBuster disc type: {0}",
+                                              _discImage.OriginalMediaType);
 
-                DicConsole.DebugWriteLine("CDRWin plugin", "\tGuessed disk type: {0}", discimage.Disktype);
+                DicConsole.DebugWriteLine("CDRWin plugin", "\tGuessed disk type: {0}", _discImage.MediaType);
 
-                if(discimage.Barcode == null)
+                if(_discImage.Barcode == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tBarcode not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tBarcode: {0}", discimage.Barcode);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tBarcode: {0}", _discImage.Barcode);
 
-                if(discimage.DiskId == null)
+                if(_discImage.DiscId == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tDisc ID not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tDisc ID: {0}", discimage.DiskId);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tDisc ID: {0}", _discImage.DiscId);
 
-                if(discimage.Mcn == null)
+                if(_discImage.Mcn == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tMCN not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tMCN: {0}", discimage.Mcn);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tMCN: {0}", _discImage.Mcn);
 
-                if(discimage.Comment == null)
+                if(_discImage.Comment == null)
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tComment not set.");
                 else
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\tComment: \"{0}\"", discimage.Comment);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\tComment: \"{0}\"", _discImage.Comment);
 
                 DicConsole.DebugWriteLine("CDRWin plugin", "Session information:");
-                DicConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} sessions", discimage.Sessions.Count);
+                DicConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} sessions", _discImage.Sessions.Count);
 
-                for(int i = 0; i < discimage.Sessions.Count; i++)
+                for(int i = 0; i < _discImage.Sessions.Count; i++)
                 {
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tSession {0} information:", i + 1);
 
                     DicConsole.DebugWriteLine("CDRWin plugin", "\t\tStarting track: {0}",
-                                              discimage.Sessions[i].StartTrack);
+                                              _discImage.Sessions[i].StartTrack);
 
                     DicConsole.DebugWriteLine("CDRWin plugin", "\t\tStarting sector: {0}",
-                                              discimage.Sessions[i].StartSector);
+                                              _discImage.Sessions[i].StartSector);
 
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tEnding track: {0}", discimage.Sessions[i].EndTrack);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tEnding track: {0}",
+                                              _discImage.Sessions[i].EndTrack);
 
                     DicConsole.DebugWriteLine("CDRWin plugin", "\t\tEnding sector: {0}",
-                                              discimage.Sessions[i].EndSector);
+                                              _discImage.Sessions[i].EndSector);
                 }
 
                 DicConsole.DebugWriteLine("CDRWin plugin", "Track information:");
-                DicConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} tracks", discimage.Tracks.Count);
+                DicConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} tracks", _discImage.Tracks.Count);
 
-                for(int i = 0; i < discimage.Tracks.Count; i++)
+                for(int i = 0; i < _discImage.Tracks.Count; i++)
                 {
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tTrack {0} information:",
-                                              discimage.Tracks[i].Sequence);
+                                              _discImage.Tracks[i].Sequence);
 
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\t{0} bytes per sector", discimage.Tracks[i].Bps);
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tPregap: {0} sectors", discimage.Tracks[i].Pregap);
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tData: {0} sectors", discimage.Tracks[i].Sectors);
-                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tPostgap: {0} sectors", discimage.Tracks[i].Postgap);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\t{0} bytes per sector", _discImage.Tracks[i].Bps);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tPregap: {0} sectors", _discImage.Tracks[i].Pregap);
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tData: {0} sectors", _discImage.Tracks[i].Sectors);
 
-                    if(discimage.Tracks[i].Flag4ch)
+                    DicConsole.DebugWriteLine("CDRWin plugin", "\t\tPostgap: {0} sectors",
+                                              _discImage.Tracks[i].Postgap);
+
+                    if(_discImage.Tracks[i].Flag4ch)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tTrack is flagged as quadraphonic");
 
-                    if(discimage.Tracks[i].FlagDcp)
+                    if(_discImage.Tracks[i].FlagDcp)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tTrack allows digital copy");
 
-                    if(discimage.Tracks[i].FlagPre)
+                    if(_discImage.Tracks[i].FlagPre)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tTrack has pre-emphasis applied");
 
-                    if(discimage.Tracks[i].FlagScms)
+                    if(_discImage.Tracks[i].FlagScms)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tTrack has SCMS");
 
                     DicConsole.DebugWriteLine("CDRWin plugin",
                                               "\t\tTrack resides in file {0}, type defined as {1}, starting at byte {2}",
-                                              discimage.Tracks[i].Trackfile.Datafilter.GetFilename(),
-                                              discimage.Tracks[i].Trackfile.Filetype,
-                                              discimage.Tracks[i].Trackfile.Offset);
+                                              _discImage.Tracks[i].TrackFile.DataFilter.GetFilename(),
+                                              _discImage.Tracks[i].TrackFile.FileType,
+                                              _discImage.Tracks[i].TrackFile.Offset);
 
                     DicConsole.DebugWriteLine("CDRWin plugin", "\t\tIndexes:");
 
-                    foreach(KeyValuePair kvp in discimage.Tracks[i].Indexes)
+                    foreach(KeyValuePair kvp in _discImage.Tracks[i].Indexes)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\t\tIndex {0} starts at sector {1}", kvp.Key,
                                                   kvp.Value);
 
-                    if(discimage.Tracks[i].Isrc == null)
+                    if(_discImage.Tracks[i].Isrc == null)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tISRC is not set.");
                     else
-                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tISRC: {0}", discimage.Tracks[i].Isrc);
+                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tISRC: {0}", _discImage.Tracks[i].Isrc);
 
-                    if(discimage.Tracks[i].Arranger == null)
+                    if(_discImage.Tracks[i].Arranger == null)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tArranger is not set.");
                     else
-                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tArranger: {0}", discimage.Tracks[i].Arranger);
+                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tArranger: {0}", _discImage.Tracks[i].Arranger);
 
-                    if(discimage.Tracks[i].Composer == null)
+                    if(_discImage.Tracks[i].Composer == null)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tComposer is not set.");
                     else
-                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tComposer: {0}", discimage.Tracks[i].Composer);
+                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tComposer: {0}", _discImage.Tracks[i].Composer);
 
-                    if(discimage.Tracks[i].Genre == null)
+                    if(_discImage.Tracks[i].Genre == null)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tGenre is not set.");
                     else
-                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tGenre: {0}", discimage.Tracks[i].Genre);
+                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tGenre: {0}", _discImage.Tracks[i].Genre);
 
-                    if(discimage.Tracks[i].Performer == null)
+                    if(_discImage.Tracks[i].Performer == null)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tPerformer is not set.");
                     else
-                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tPerformer: {0}", discimage.Tracks[i].Performer);
+                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tPerformer: {0}",
+                                                  _discImage.Tracks[i].Performer);
 
-                    if(discimage.Tracks[i].Songwriter == null)
+                    if(_discImage.Tracks[i].Songwriter == null)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tSongwriter is not set.");
                     else
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tSongwriter: {0}",
-                                                  discimage.Tracks[i].Songwriter);
+                                                  _discImage.Tracks[i].Songwriter);
 
-                    if(discimage.Tracks[i].Title == null)
+                    if(_discImage.Tracks[i].Title == null)
                         DicConsole.DebugWriteLine("CDRWin plugin", "\t\tTitle is not set.");
                     else
-                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tTitle: {0}", discimage.Tracks[i].Title);
+                        DicConsole.DebugWriteLine("CDRWin plugin", "\t\tTitle: {0}", _discImage.Tracks[i].Title);
                 }
 
                 DicConsole.DebugWriteLine("CDRWin plugin", "Building offset map");
@@ -955,14 +1043,14 @@ namespace DiscImageChef.DiscImages
                 ulong indexOneOffset    = 0;
                 bool  indexZero         = false;
 
-                offsetmap = new Dictionary();
+                _offsetMap = new Dictionary();
 
-                for(int i = 0; i < discimage.Tracks.Count; i++)
+                for(int i = 0; i < _discImage.Tracks.Count; i++)
                 {
                     ulong index0Len = 0;
 
-                    if(discimage.Tracks[i].Sequence == 1 &&
-                       i                            != 0)
+                    if(_discImage.Tracks[i].Sequence == 1 &&
+                       i                             != 0)
                         throw new ImageNotSupportedException("Unordered tracks");
 
                     var partition = new Partition();
@@ -1000,10 +1088,10 @@ namespace DiscImageChef.DiscImages
                         partition = new Partition();
                     }*/
 
-                    indexZero |= discimage.Tracks[i].Indexes.TryGetValue(0, out indexZeroOffset);
+                    indexZero |= _discImage.Tracks[i].Indexes.TryGetValue(0, out indexZeroOffset);
 
-                    if(!discimage.Tracks[i].Indexes.TryGetValue(1, out indexOneOffset))
-                        throw new ImageNotSupportedException($"Track {discimage.Tracks[i].Sequence} lacks index 01");
+                    if(!_discImage.Tracks[i].Indexes.TryGetValue(1, out indexOneOffset))
+                        throw new ImageNotSupportedException($"Track {_discImage.Tracks[i].Sequence} lacks index 01");
 
                     /*if(index_zero && index_one_offset > index_zero_offset)
                     {
@@ -1040,29 +1128,29 @@ namespace DiscImageChef.DiscImages
                     }*/
 
                     // Index 01
-                    partition.Description = $"Track {discimage.Tracks[i].Sequence}.";
-                    partition.Name        = discimage.Tracks[i].Title;
+                    partition.Description = $"Track {_discImage.Tracks[i].Sequence}.";
+                    partition.Name        = _discImage.Tracks[i].Title;
                     partition.Start       = sectorOffset;
-                    partition.Size        = (discimage.Tracks[i].Sectors - index0Len) * discimage.Tracks[i].Bps;
-                    partition.Length      = discimage.Tracks[i].Sectors - index0Len;
+                    partition.Size        = (_discImage.Tracks[i].Sectors - index0Len) * _discImage.Tracks[i].Bps;
+                    partition.Length      = _discImage.Tracks[i].Sectors - index0Len;
                     partition.Sequence    = partitionSequence;
                     partition.Offset      = byteOffset;
-                    partition.Type        = discimage.Tracks[i].Tracktype;
+                    partition.Type        = _discImage.Tracks[i].TrackType;
 
                     sectorOffset += partition.Length;
                     byteOffset   += partition.Size;
                     partitionSequence++;
 
-                    if(!offsetmap.ContainsKey(discimage.Tracks[i].Sequence))
-                        offsetmap.Add(discimage.Tracks[i].Sequence, partition.Start);
+                    if(!_offsetMap.ContainsKey(_discImage.Tracks[i].Sequence))
+                        _offsetMap.Add(_discImage.Tracks[i].Sequence, partition.Start);
                     else
                     {
-                        offsetmap.TryGetValue(discimage.Tracks[i].Sequence, out ulong oldStart);
+                        _offsetMap.TryGetValue(_discImage.Tracks[i].Sequence, out ulong oldStart);
 
                         if(partition.Start < oldStart)
                         {
-                            offsetmap.Remove(discimage.Tracks[i].Sequence);
-                            offsetmap.Add(discimage.Tracks[i].Sequence, partition.Start);
+                            _offsetMap.Remove(_discImage.Tracks[i].Sequence);
+                            _offsetMap.Add(_discImage.Tracks[i].Sequence, partition.Start);
                         }
                     }
 
@@ -1084,133 +1172,134 @@ namespace DiscImageChef.DiscImages
                     DicConsole.DebugWriteLine("CDRWin plugin", "\tPartition size in bytes: {0}", partition.Size);
                 }
 
-                foreach(CdrWinTrack track in discimage.Tracks)
-                    imageInfo.ImageSize += track.Bps * track.Sectors;
+                foreach(CdrWinTrack track in _discImage.Tracks)
+                    _imageInfo.ImageSize += track.Bps * track.Sectors;
 
-                foreach(CdrWinTrack track in discimage.Tracks)
-                    imageInfo.Sectors += track.Sectors;
+                foreach(CdrWinTrack track in _discImage.Tracks)
+                    _imageInfo.Sectors += track.Sectors;
 
-                if(discimage.Disktype != MediaType.CDROMXA &&
-                   discimage.Disktype != MediaType.CDDA    &&
-                   discimage.Disktype != MediaType.CDI     &&
-                   discimage.Disktype != MediaType.CDPLUS  &&
-                   discimage.Disktype != MediaType.CDG     &&
-                   discimage.Disktype != MediaType.CDEG    &&
-                   discimage.Disktype != MediaType.CDMIDI)
-                    imageInfo.SectorSize = 2048; // Only data tracks
+                if(_discImage.MediaType != MediaType.CDROMXA &&
+                   _discImage.MediaType != MediaType.CDDA    &&
+                   _discImage.MediaType != MediaType.CDI     &&
+                   _discImage.MediaType != MediaType.CDPLUS  &&
+                   _discImage.MediaType != MediaType.CDG     &&
+                   _discImage.MediaType != MediaType.CDEG    &&
+                   _discImage.MediaType != MediaType.CDMIDI)
+                    _imageInfo.SectorSize = 2048; // Only data tracks
                 else
-                    imageInfo.SectorSize = 2352; // All others
+                    _imageInfo.SectorSize = 2352; // All others
 
-                if(discimage.Mcn != null)
-                    imageInfo.ReadableMediaTags.Add(MediaTagType.CD_MCN);
+                if(_discImage.Mcn != null)
+                    _imageInfo.ReadableMediaTags.Add(MediaTagType.CD_MCN);
 
-                if(discimage.Cdtextfile != null)
-                    imageInfo.ReadableMediaTags.Add(MediaTagType.CD_TEXT);
+                if(_discImage.CdTextFile != null)
+                    _imageInfo.ReadableMediaTags.Add(MediaTagType.CD_TEXT);
 
-                // Detect ISOBuster extensions
-                if(discimage.Disktypestr != null                     ||
-                   discimage.Comment.ToLower().Contains("isobuster") ||
-                   discimage.Sessions.Count > 1)
-                    imageInfo.Application = "ISOBuster";
-                else if(imageInfo.Application is null)
+                if(_imageInfo.Application is null)
                 {
-                    if(discimage.IsTrurip)
-                        imageInfo.Application = "trurip";
+                    if(_discImage.IsTrurip)
+                        _imageInfo.Application = "trurip";
+
+                    // Detect ISOBuster extensions
+                    else if(_discImage.OriginalMediaType != null               ||
+                            _discImage.Comment.ToLower().Contains("isobuster") ||
+                            _discImage.Sessions.Count > 1)
+                        _imageInfo.Application = "ISOBuster";
                     else
-                        imageInfo.Application = "CDRWin";
+                        _imageInfo.Application = "CDRWin";
                 }
 
-                imageInfo.CreationTime         = imageFilter.GetCreationTime();
-                imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
+                _imageInfo.CreationTime         = imageFilter.GetCreationTime();
+                _imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
 
-                imageInfo.Comments          = discimage.Comment;
-                imageInfo.MediaSerialNumber = discimage.Mcn;
-                imageInfo.MediaBarcode      = discimage.Barcode;
-                imageInfo.MediaType         = discimage.Disktype;
+                _imageInfo.Comments          = _discImage.Comment;
+                _imageInfo.MediaSerialNumber = _discImage.Mcn;
+                _imageInfo.MediaBarcode      = _discImage.Barcode;
+                _imageInfo.MediaType         = _discImage.MediaType;
 
-                imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackFlags);
+                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackFlags);
 
-                foreach(CdrWinTrack track in discimage.Tracks)
-                    switch(track.Tracktype)
+                foreach(CdrWinTrack track in _discImage.Tracks)
+                    switch(track.TrackType)
                     {
                         case CDRWIN_TRACK_TYPE_AUDIO:
                         {
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdTrackIsrc))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackIsrc);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdTrackIsrc))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackIsrc);
 
                             break;
                         }
                         case CDRWIN_TRACK_TYPE_CDG:
                         {
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdTrackIsrc))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackIsrc);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdTrackIsrc))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackIsrc);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
 
                             break;
                         }
                         case CDRWIN_TRACK_TYPE_MODE2_FORMLESS:
                         case CDRWIN_TRACK_TYPE_CDI:
                         {
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
 
                             break;
                         }
                         case CDRWIN_TRACK_TYPE_MODE2_RAW:
                         case CDRWIN_TRACK_TYPE_CDI_RAW:
                         {
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
 
                             break;
                         }
                         case CDRWIN_TRACK_TYPE_MODE1_RAW:
                         {
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccP))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccP);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEccQ))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ);
 
-                            if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
-                                imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
+                            if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
+                                _imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
 
                             break;
                         }
                     }
 
-                imageInfo.XmlMediaType = XmlMediaType.OpticalDisc;
+                _imageInfo.XmlMediaType = XmlMediaType.OpticalDisc;
 
-                DicConsole.VerboseWriteLine("CDRWIN image describes a disc of type {0}", imageInfo.MediaType);
+                DicConsole.VerboseWriteLine("CDRWIN image describes a disc of type {0}", _imageInfo.MediaType);
 
-                if(!string.IsNullOrEmpty(imageInfo.Comments))
-                    DicConsole.VerboseWriteLine("CDRWIN comments: {0}", imageInfo.Comments);
+                if(!string.IsNullOrEmpty(_imageInfo.Comments))
+                    DicConsole.VerboseWriteLine("CDRWIN comments: {0}", _imageInfo.Comments);
 
                 return true;
             }
@@ -1230,16 +1319,16 @@ namespace DiscImageChef.DiscImages
             {
                 case MediaTagType.CD_MCN:
                 {
-                    if(discimage.Mcn != null)
-                        return Encoding.ASCII.GetBytes(discimage.Mcn);
+                    if(_discImage.Mcn != null)
+                        return Encoding.ASCII.GetBytes(_discImage.Mcn);
 
                     throw new FeatureNotPresentImageException("Image does not contain MCN information.");
                 }
                 case MediaTagType.CD_TEXT:
                 {
-                    if(discimage.Cdtextfile != null)
+                    if(_discImage.CdTextFile != null)
 
-                        // TODO: Check that binary text file exists, open it, read it, send it to caller.
+                        // TODO: Check binary text file exists, open it, read it, send it to caller.
                         throw new FeatureSupportedButNotImplementedImageException("Feature not yet implemented");
 
                     throw new FeatureNotPresentImageException("Image does not contain CD-TEXT information.");
@@ -1260,8 +1349,8 @@ namespace DiscImageChef.DiscImages
 
         public byte[] ReadSectors(ulong sectorAddress, uint length)
         {
-            foreach(KeyValuePair kvp in from kvp in offsetmap where sectorAddress >= kvp.Value
-                                                     from cdrwinTrack in discimage.Tracks
+            foreach(KeyValuePair kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
+                                                     from cdrwinTrack in _discImage.Tracks
                                                      where cdrwinTrack.Sequence      == kvp.Key
                                                      where sectorAddress - kvp.Value < cdrwinTrack.Sectors select kvp)
                 return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key);
@@ -1271,8 +1360,8 @@ namespace DiscImageChef.DiscImages
 
         public byte[] ReadSectorsTag(ulong sectorAddress, uint length, SectorTagType tag)
         {
-            foreach(KeyValuePair kvp in from kvp in offsetmap where sectorAddress >= kvp.Value
-                                                     from cdrwinTrack in discimage.Tracks
+            foreach(KeyValuePair kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
+                                                     from cdrwinTrack in _discImage.Tracks
                                                      where cdrwinTrack.Sequence      == kvp.Key
                                                      where sectorAddress - kvp.Value < cdrwinTrack.Sectors select kvp)
                 return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag);
@@ -1287,7 +1376,7 @@ namespace DiscImageChef.DiscImages
                 Sequence = 0
             };
 
-            foreach(CdrWinTrack cdrwinTrack in discimage.Tracks.Where(cdrwinTrack => cdrwinTrack.Sequence == track))
+            foreach(CdrWinTrack cdrwinTrack in _discImage.Tracks.Where(cdrwinTrack => cdrwinTrack.Sequence == track))
             {
                 dicTrack = cdrwinTrack;
 
@@ -1305,7 +1394,7 @@ namespace DiscImageChef.DiscImages
             uint sectorSize;
             uint sectorSkip;
 
-            switch(dicTrack.Tracktype)
+            switch(dicTrack.TrackType)
             {
                 case CDRWIN_TRACK_TYPE_MODE1:
                 case CDRWIN_TRACK_TYPE_MODE2_FORM1:
@@ -1378,11 +1467,11 @@ namespace DiscImageChef.DiscImages
 
             byte[] buffer = new byte[sectorSize * length];
 
-            imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream();
-            var br = new BinaryReader(imageStream);
+            _imageStream = dicTrack.TrackFile.DataFilter.GetDataForkStream();
+            var br = new BinaryReader(_imageStream);
 
             br.BaseStream.
-               Seek((long)dicTrack.Trackfile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
+               Seek((long)dicTrack.TrackFile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
                     SeekOrigin.Begin);
 
             if(sectorOffset == 0 &&
@@ -1407,7 +1496,7 @@ namespace DiscImageChef.DiscImages
                 Sequence = 0
             };
 
-            foreach(CdrWinTrack cdrwinTrack in discimage.Tracks.Where(cdrwinTrack => cdrwinTrack.Sequence == track))
+            foreach(CdrWinTrack cdrwinTrack in _discImage.Tracks.Where(cdrwinTrack => cdrwinTrack.Sequence == track))
             {
                 dicTrack = cdrwinTrack;
 
@@ -1439,8 +1528,8 @@ namespace DiscImageChef.DiscImages
                 {
                     CdFlags flags = 0;
 
-                    if(dicTrack.Tracktype != CDRWIN_TRACK_TYPE_AUDIO &&
-                       dicTrack.Tracktype != CDRWIN_TRACK_TYPE_CDG)
+                    if(dicTrack.TrackType != CDRWIN_TRACK_TYPE_AUDIO &&
+                       dicTrack.TrackType != CDRWIN_TRACK_TYPE_CDG)
                         flags |= CdFlags.DataTrack;
 
                     if(dicTrack.FlagDcp)
@@ -1458,16 +1547,14 @@ namespace DiscImageChef.DiscImages
                     };
                 }
                 case SectorTagType.CdTrackIsrc:
-                    if(dicTrack.Isrc == null)
-                        return null;
+                    return dicTrack.Isrc == null ? null : Encoding.UTF8.GetBytes(dicTrack.Isrc);
 
-                    return Encoding.UTF8.GetBytes(dicTrack.Isrc);
                 case SectorTagType.CdTrackText:
                     throw new FeatureSupportedButNotImplementedImageException("Feature not yet implemented");
                 default: throw new ArgumentException("Unsupported tag requested", nameof(tag));
             }
 
-            switch(dicTrack.Tracktype)
+            switch(dicTrack.TrackType)
             {
                 case CDRWIN_TRACK_TYPE_MODE1:
                 case CDRWIN_TRACK_TYPE_MODE2_FORM1:
@@ -1587,11 +1674,11 @@ namespace DiscImageChef.DiscImages
 
             byte[] buffer = new byte[sectorSize * length];
 
-            imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream();
-            var br = new BinaryReader(imageStream);
+            _imageStream = dicTrack.TrackFile.DataFilter.GetDataForkStream();
+            var br = new BinaryReader(_imageStream);
 
             br.BaseStream.
-               Seek((long)dicTrack.Trackfile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
+               Seek((long)dicTrack.TrackFile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
                     SeekOrigin.Begin);
 
             if(sectorOffset == 0 &&
@@ -1615,8 +1702,8 @@ namespace DiscImageChef.DiscImages
 
         public byte[] ReadSectorsLong(ulong sectorAddress, uint length)
         {
-            foreach(KeyValuePair kvp in from kvp in offsetmap where sectorAddress >= kvp.Value
-                                                     from cdrwinTrack in discimage.Tracks
+            foreach(KeyValuePair kvp in from kvp in _offsetMap where sectorAddress >= kvp.Value
+                                                     from cdrwinTrack in _discImage.Tracks
                                                      where cdrwinTrack.Sequence      == kvp.Key
                                                      where sectorAddress - kvp.Value < cdrwinTrack.Sectors select kvp)
                 return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key);
@@ -1631,7 +1718,7 @@ namespace DiscImageChef.DiscImages
                 Sequence = 0
             };
 
-            foreach(CdrWinTrack cdrwinTrack in discimage.Tracks.Where(cdrwinTrack => cdrwinTrack.Sequence == track))
+            foreach(CdrWinTrack cdrwinTrack in _discImage.Tracks.Where(cdrwinTrack => cdrwinTrack.Sequence == track))
             {
                 dicTrack = cdrwinTrack;
 
@@ -1649,7 +1736,7 @@ namespace DiscImageChef.DiscImages
             uint sectorSize;
             uint sectorSkip;
 
-            switch(dicTrack.Tracktype)
+            switch(dicTrack.TrackType)
             {
                 case CDRWIN_TRACK_TYPE_MODE1:
                 case CDRWIN_TRACK_TYPE_MODE2_FORM1:
@@ -1701,11 +1788,11 @@ namespace DiscImageChef.DiscImages
 
             byte[] buffer = new byte[sectorSize * length];
 
-            imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream();
-            var br = new BinaryReader(imageStream);
+            _imageStream = dicTrack.TrackFile.DataFilter.GetDataForkStream();
+            var br = new BinaryReader(_imageStream);
 
             br.BaseStream.
-               Seek((long)dicTrack.Trackfile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
+               Seek((long)dicTrack.TrackFile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
                     SeekOrigin.Begin);
 
             if(sectorOffset == 0 &&
@@ -1726,7 +1813,7 @@ namespace DiscImageChef.DiscImages
 
         public List GetSessionTracks(Session session)
         {
-            if(discimage.Sessions.Contains(session))
+            if(_discImage.Sessions.Contains(session))
                 return GetSessionTracks(session.SessionSequence);
 
             throw new ImageNotSupportedException("Session does not exist in disc image");
@@ -1736,7 +1823,7 @@ namespace DiscImageChef.DiscImages
         {
             List tracks = new List();
 
-            foreach(CdrWinTrack cdrTrack in discimage.Tracks)
+            foreach(CdrWinTrack cdrTrack in _discImage.Tracks)
                 if(cdrTrack.Session == session)
                 {
                     var dicTrack = new Track
@@ -1744,12 +1831,12 @@ namespace DiscImageChef.DiscImages
                         Indexes             = cdrTrack.Indexes, TrackDescription = cdrTrack.Title,
                         TrackPregap         = cdrTrack.Pregap,
                         TrackSession        = cdrTrack.Session, TrackSequence = cdrTrack.Sequence,
-                        TrackType           = CdrWinTrackTypeToTrackType(cdrTrack.Tracktype),
-                        TrackFile           = cdrTrack.Trackfile.Datafilter.GetFilename(),
-                        TrackFilter         = cdrTrack.Trackfile.Datafilter,
-                        TrackFileOffset     = cdrTrack.Trackfile.Offset,
-                        TrackFileType       = cdrTrack.Trackfile.Filetype, TrackRawBytesPerSector = cdrTrack.Bps,
-                        TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.Tracktype)
+                        TrackType           = CdrWinTrackTypeToTrackType(cdrTrack.TrackType),
+                        TrackFile           = cdrTrack.TrackFile.DataFilter.GetFilename(),
+                        TrackFilter         = cdrTrack.TrackFile.DataFilter,
+                        TrackFileOffset     = cdrTrack.TrackFile.Offset,
+                        TrackFileType       = cdrTrack.TrackFile.FileType, TrackRawBytesPerSector = cdrTrack.Bps,
+                        TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.TrackType)
                     };
 
                     if(!cdrTrack.Indexes.TryGetValue(0, out dicTrack.TrackStartSector))
@@ -1757,11 +1844,11 @@ namespace DiscImageChef.DiscImages
 
                     dicTrack.TrackEndSector = (dicTrack.TrackStartSector + cdrTrack.Sectors) - 1;
 
-                    if(cdrTrack.Tracktype == CDRWIN_TRACK_TYPE_CDG)
+                    if(cdrTrack.TrackType == CDRWIN_TRACK_TYPE_CDG)
                     {
-                        dicTrack.TrackSubchannelFilter = cdrTrack.Trackfile.Datafilter;
-                        dicTrack.TrackSubchannelFile   = cdrTrack.Trackfile.Datafilter.GetFilename();
-                        dicTrack.TrackSubchannelOffset = cdrTrack.Trackfile.Offset;
+                        dicTrack.TrackSubchannelFilter = cdrTrack.TrackFile.DataFilter;
+                        dicTrack.TrackSubchannelFile   = cdrTrack.TrackFile.DataFilter.GetFilename();
+                        dicTrack.TrackSubchannelOffset = cdrTrack.TrackFile.Offset;
                         dicTrack.TrackSubchannelType   = TrackSubchannelType.RawInterleaved;
                     }
                     else
diff --git a/DiscImageChef.DiscImages/CDRWin/Structs.cs b/DiscImageChef.DiscImages/CDRWin/Structs.cs
index f39351d3f..b8e25512c 100644
--- a/DiscImageChef.DiscImages/CDRWin/Structs.cs
+++ b/DiscImageChef.DiscImages/CDRWin/Structs.cs
@@ -44,11 +44,11 @@ namespace DiscImageChef.DiscImages
             /// Track #
             public uint Sequence;
             /// Filter of file containing track
-            public IFilter Datafilter;
+            public IFilter DataFilter;
             /// Offset of track start in file
             public ulong Offset;
             /// Type of file
-            public string Filetype;
+            public string FileType;
         }
 
         struct CdrWinTrack
@@ -70,18 +70,18 @@ namespace DiscImageChef.DiscImages
             /// Track ISRC
             public string Isrc;
             /// File struct for this track
-            public CdrWinTrackFile Trackfile;
+            public CdrWinTrackFile TrackFile;
             /// Indexes on this track
             public Dictionary Indexes;
             /// Track pre-gap in sectors
             public ulong Pregap;
             /// Track post-gap in sectors
             public ulong Postgap;
-            /// Digical Copy Permitted
+            /// Digital Copy Permitted
             public bool FlagDcp;
             /// Track is quadraphonic
             public bool Flag4ch;
-            /// Track has preemphasis
+            /// Track has pre-emphasis
             public bool FlagPre;
             /// Track has SCMS
             public bool FlagScms;
@@ -90,7 +90,7 @@ namespace DiscImageChef.DiscImages
             /// Sectors in track
             public ulong Sectors;
             /// Track type
-            public string Tracktype;
+            public string TrackType;
             /// Track session
             public ushort Session;
         }
@@ -112,11 +112,11 @@ namespace DiscImageChef.DiscImages
             /// Media catalog number
             public string Mcn;
             /// Disk type
-            public MediaType Disktype;
+            public MediaType MediaType;
             /// Disk type string
-            public string Disktypestr;
+            public string OriginalMediaType;
             /// Disk CDDB ID
-            public string DiskId;
+            public string DiscId;
             /// Disk UPC/EAN
             public string Barcode;
             /// Sessions
@@ -126,11 +126,13 @@ namespace DiscImageChef.DiscImages
             /// Disk comment
             public string Comment;
             /// File containing CD-Text
-            public string Cdtextfile;
+            public string CdTextFile;
             /// Has trurip extensions
             public bool IsTrurip;
             /// Disc image hashes
             public Dictionary DiscHashes;
+            /// DIC media type
+            public string DicMediaType;
         }
     }
 }
\ No newline at end of file
diff --git a/DiscImageChef.DiscImages/CDRWin/Verify.cs b/DiscImageChef.DiscImages/CDRWin/Verify.cs
index 3846ab4c2..02bdf1035 100644
--- a/DiscImageChef.DiscImages/CDRWin/Verify.cs
+++ b/DiscImageChef.DiscImages/CDRWin/Verify.cs
@@ -44,27 +44,28 @@ namespace DiscImageChef.DiscImages
     {
         public bool? VerifyMediaImage()
         {
-            if(discimage.DiscHashes.Count == 0) return null;
+            if(_discImage.DiscHashes.Count == 0)
+                return null;
 
-            // Read up to 1MiB at a time for verification
-            const int VERIFY_SIZE = 1024 * 1024;
+            // Read up to 1 MiB at a time for verification
+            const int verifySize = 1024 * 1024;
             long      readBytes;
             byte[]    verifyBytes;
 
-            IFilter[] filters = discimage.Tracks.OrderBy(t => t.Sequence).Select(t => t.Trackfile.Datafilter).Distinct()
-                                         .ToArray();
+            IFilter[] filters = _discImage.Tracks.OrderBy(t => t.Sequence).Select(t => t.TrackFile.DataFilter).
+                                           Distinct().ToArray();
 
-            if(discimage.DiscHashes.TryGetValue("sha1", out string sha1))
+            if(_discImage.DiscHashes.TryGetValue("sha1", out string sha1))
             {
-                Sha1Context ctx = new Sha1Context();
+                var ctx = new Sha1Context();
 
                 foreach(IFilter filter in filters)
                 {
                     Stream stream = filter.GetDataForkStream();
                     readBytes   = 0;
-                    verifyBytes = new byte[VERIFY_SIZE];
+                    verifyBytes = new byte[verifySize];
 
-                    while(readBytes + VERIFY_SIZE < stream.Length)
+                    while(readBytes + verifySize < stream.Length)
                     {
                         stream.Read(verifyBytes, 0, verifyBytes.Length);
                         ctx.Update(verifyBytes);
@@ -78,22 +79,22 @@ namespace DiscImageChef.DiscImages
 
                 string verifySha1 = ctx.End();
                 DicConsole.DebugWriteLine("CDRWin plugin", "Calculated SHA1: {0}", verifySha1);
-                DicConsole.DebugWriteLine("CDRWin plugin", "Expected SHA1: {0}",   sha1);
+                DicConsole.DebugWriteLine("CDRWin plugin", "Expected SHA1: {0}", sha1);
 
                 return verifySha1 == sha1;
             }
 
-            if(discimage.DiscHashes.TryGetValue("md5", out string md5))
+            if(_discImage.DiscHashes.TryGetValue("md5", out string md5))
             {
-                Md5Context ctx = new Md5Context();
+                var ctx = new Md5Context();
 
                 foreach(IFilter filter in filters)
                 {
                     Stream stream = filter.GetDataForkStream();
                     readBytes   = 0;
-                    verifyBytes = new byte[VERIFY_SIZE];
+                    verifyBytes = new byte[verifySize];
 
-                    while(readBytes + VERIFY_SIZE < stream.Length)
+                    while(readBytes + verifySize < stream.Length)
                     {
                         stream.Read(verifyBytes, 0, verifyBytes.Length);
                         ctx.Update(verifyBytes);
@@ -107,22 +108,22 @@ namespace DiscImageChef.DiscImages
 
                 string verifyMd5 = ctx.End();
                 DicConsole.DebugWriteLine("CDRWin plugin", "Calculated MD5: {0}", verifyMd5);
-                DicConsole.DebugWriteLine("CDRWin plugin", "Expected MD5: {0}",   md5);
+                DicConsole.DebugWriteLine("CDRWin plugin", "Expected MD5: {0}", md5);
 
                 return verifyMd5 == md5;
             }
 
-            if(discimage.DiscHashes.TryGetValue("crc32", out string crc32))
+            if(_discImage.DiscHashes.TryGetValue("crc32", out string crc32))
             {
-                Crc32Context ctx = new Crc32Context();
+                var ctx = new Crc32Context();
 
                 foreach(IFilter filter in filters)
                 {
                     Stream stream = filter.GetDataForkStream();
                     readBytes   = 0;
-                    verifyBytes = new byte[VERIFY_SIZE];
+                    verifyBytes = new byte[verifySize];
 
-                    while(readBytes + VERIFY_SIZE < stream.Length)
+                    while(readBytes + verifySize < stream.Length)
                     {
                         stream.Read(verifyBytes, 0, verifyBytes.Length);
                         ctx.Update(verifyBytes);
@@ -136,12 +137,12 @@ namespace DiscImageChef.DiscImages
 
                 string verifyCrc = ctx.End();
                 DicConsole.DebugWriteLine("CDRWin plugin", "Calculated CRC32: {0}", verifyCrc);
-                DicConsole.DebugWriteLine("CDRWin plugin", "Expected CRC32: {0}",   crc32);
+                DicConsole.DebugWriteLine("CDRWin plugin", "Expected CRC32: {0}", crc32);
 
                 return verifyCrc == crc32;
             }
 
-            foreach(string hash in discimage.DiscHashes.Keys)
+            foreach(string hash in _discImage.DiscHashes.Keys)
                 DicConsole.DebugWriteLine("CDRWin plugin", "Found unsupported hash {0}", hash);
 
             return null;
@@ -150,10 +151,11 @@ namespace DiscImageChef.DiscImages
         public bool? VerifySector(ulong sectorAddress)
         {
             byte[] buffer = ReadSectorLong(sectorAddress);
+
             return CdChecksums.CheckCdSector(buffer);
         }
 
-        public bool? VerifySectors(ulong           sectorAddress, uint length, out List failingLbas,
+        public bool? VerifySectors(ulong sectorAddress, uint length, out List failingLbas,
                                    out List unknownLbas)
         {
             byte[] buffer = ReadSectorsLong(sectorAddress, length);
@@ -171,19 +173,22 @@ namespace DiscImageChef.DiscImages
                 {
                     case null:
                         unknownLbas.Add((ulong)i + sectorAddress);
+
                         break;
                     case false:
                         failingLbas.Add((ulong)i + sectorAddress);
+
                         break;
                 }
             }
 
-            if(unknownLbas.Count > 0) return null;
+            if(unknownLbas.Count > 0)
+                return null;
 
             return failingLbas.Count <= 0;
         }
 
-        public bool? VerifySectors(ulong           sectorAddress, uint length, uint track, out List failingLbas,
+        public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List failingLbas,
                                    out List unknownLbas)
         {
             byte[] buffer = ReadSectorsLong(sectorAddress, length, track);
@@ -201,14 +206,17 @@ namespace DiscImageChef.DiscImages
                 {
                     case null:
                         unknownLbas.Add((ulong)i + sectorAddress);
+
                         break;
                     case false:
                         failingLbas.Add((ulong)i + sectorAddress);
+
                         break;
                 }
             }
 
-            if(unknownLbas.Count > 0) return null;
+            if(unknownLbas.Count > 0)
+                return null;
 
             return failingLbas.Count <= 0;
         }
@@ -216,6 +224,7 @@ namespace DiscImageChef.DiscImages
         public bool? VerifySector(ulong sectorAddress, uint track)
         {
             byte[] buffer = ReadSectorLong(sectorAddress, track);
+
             return CdChecksums.CheckCdSector(buffer);
         }
     }
diff --git a/DiscImageChef.DiscImages/CDRWin/Write.cs b/DiscImageChef.DiscImages/CDRWin/Write.cs
index 0cad67808..eec7cac90 100644
--- a/DiscImageChef.DiscImages/CDRWin/Write.cs
+++ b/DiscImageChef.DiscImages/CDRWin/Write.cs
@@ -51,32 +51,32 @@ namespace DiscImageChef.DiscImages
             {
                 if(options.TryGetValue("separate", out string tmpValue))
                 {
-                    if(!bool.TryParse(tmpValue, out separateTracksWriting))
+                    if(!bool.TryParse(tmpValue, out _separateTracksWriting))
                     {
                         ErrorMessage = "Invalid value for split option";
 
                         return false;
                     }
 
-                    if(separateTracksWriting)
+                    if(_separateTracksWriting)
                     {
-                        ErrorMessage = "Separate tracksnot yet implemented";
+                        ErrorMessage = "Separate tracks not yet implemented";
 
                         return false;
                     }
                 }
             }
             else
-                separateTracksWriting = false;
+                _separateTracksWriting = false;
 
             if(!SupportedMediaTypes.Contains(mediaType))
             {
-                ErrorMessage = $"Unsupport media format {mediaType}";
+                ErrorMessage = $"Unsupported media format {mediaType}";
 
                 return false;
             }
 
-            imageInfo = new ImageInfo
+            _imageInfo = new ImageInfo
             {
                 MediaType = mediaType, SectorSize = sectorSize, Sectors = sectors
             };
@@ -84,8 +84,8 @@ namespace DiscImageChef.DiscImages
             // TODO: Separate tracks
             try
             {
-                writingBaseName  = Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path));
-                descriptorStream = new StreamWriter(path, false, Encoding.ASCII);
+                _writingBaseName  = Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path));
+                _descriptorStream = new StreamWriter(path, false, Encoding.ASCII);
             }
             catch(IOException e)
             {
@@ -94,13 +94,13 @@ namespace DiscImageChef.DiscImages
                 return false;
             }
 
-            discimage = new CdrWinDisc
+            _discImage = new CdrWinDisc
             {
-                Disktype = mediaType, Sessions = new List(), Tracks = new List()
+                MediaType = mediaType, Sessions = new List(), Tracks = new List()
             };
 
-            trackFlags = new Dictionary();
-            trackIsrcs = new Dictionary();
+            _trackFlags = new Dictionary();
+            _trackIsrcs = new Dictionary();
 
             IsWriting    = true;
             ErrorMessage = null;
@@ -120,15 +120,15 @@ namespace DiscImageChef.DiscImages
             switch(tag)
             {
                 case MediaTagType.CD_MCN:
-                    discimage.Mcn = Encoding.ASCII.GetString(data);
+                    _discImage.Mcn = Encoding.ASCII.GetString(data);
 
                     return true;
                 case MediaTagType.CD_TEXT:
-                    var cdTextStream = new FileStream(writingBaseName + "_cdtext.bin", FileMode.Create,
+                    var cdTextStream = new FileStream(_writingBaseName + "_cdtext.bin", FileMode.Create,
                                                       FileAccess.ReadWrite, FileShare.None);
 
                     cdTextStream.Write(data, 0, data.Length);
-                    discimage.Cdtextfile = Path.GetFileName(cdTextStream.Name);
+                    _discImage.CdTextFile = Path.GetFileName(cdTextStream.Name);
                     cdTextStream.Close();
 
                     return true;
@@ -149,8 +149,8 @@ namespace DiscImageChef.DiscImages
             }
 
             Track track =
-                writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
-                                                    sectorAddress <= trk.TrackEndSector);
+                _writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
+                                                     sectorAddress <= trk.TrackEndSector);
 
             if(track.TrackSequence == 0)
             {
@@ -159,7 +159,7 @@ namespace DiscImageChef.DiscImages
                 return false;
             }
 
-            FileStream trackStream = writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
+            FileStream trackStream = _writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
 
             if(trackStream == null)
             {
@@ -201,8 +201,8 @@ namespace DiscImageChef.DiscImages
             }
 
             Track track =
-                writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
-                                                    sectorAddress <= trk.TrackEndSector);
+                _writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
+                                                     sectorAddress <= trk.TrackEndSector);
 
             if(track.TrackSequence == 0)
             {
@@ -211,7 +211,7 @@ namespace DiscImageChef.DiscImages
                 return false;
             }
 
-            FileStream trackStream = writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
+            FileStream trackStream = _writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
 
             if(trackStream == null)
             {
@@ -260,8 +260,8 @@ namespace DiscImageChef.DiscImages
             }
 
             Track track =
-                writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
-                                                    sectorAddress <= trk.TrackEndSector);
+                _writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
+                                                     sectorAddress <= trk.TrackEndSector);
 
             if(track.TrackSequence == 0)
             {
@@ -270,7 +270,7 @@ namespace DiscImageChef.DiscImages
                 return false;
             }
 
-            FileStream trackStream = writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
+            FileStream trackStream = _writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
 
             if(trackStream == null)
             {
@@ -305,8 +305,8 @@ namespace DiscImageChef.DiscImages
             }
 
             Track track =
-                writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
-                                                    sectorAddress <= trk.TrackEndSector);
+                _writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
+                                                     sectorAddress <= trk.TrackEndSector);
 
             if(track.TrackSequence == 0)
             {
@@ -315,7 +315,7 @@ namespace DiscImageChef.DiscImages
                 return false;
             }
 
-            FileStream trackStream = writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
+            FileStream trackStream = _writingStreams.FirstOrDefault(kvp => kvp.Key == track.TrackSequence).Value;
 
             if(trackStream == null)
             {
@@ -364,42 +364,42 @@ namespace DiscImageChef.DiscImages
                 return false;
             }
 
-            if(writingTracks  != null &&
-               writingStreams != null)
-                foreach(FileStream oldTrack in writingStreams.Select(t => t.Value).Distinct())
+            if(_writingTracks  != null &&
+               _writingStreams != null)
+                foreach(FileStream oldTrack in _writingStreams.Select(t => t.Value).Distinct())
                     oldTrack.Close();
 
             ulong currentOffset = 0;
-            writingTracks = new List();
+            _writingTracks = new List();
 
             foreach(Track track in tracks.OrderBy(t => t.TrackSequence))
             {
                 Track newTrack = track;
 
-                newTrack.TrackFile = separateTracksWriting ? writingBaseName + $"_track{track.TrackSequence:D2}.bin"
-                                         : writingBaseName                   + ".bin";
+                newTrack.TrackFile = _separateTracksWriting ? _writingBaseName + $"_track{track.TrackSequence:D2}.bin"
+                                         : _writingBaseName                    + ".bin";
 
-                newTrack.TrackFileOffset = separateTracksWriting ? 0 : currentOffset;
-                writingTracks.Add(newTrack);
+                newTrack.TrackFileOffset = _separateTracksWriting ? 0 : currentOffset;
+                _writingTracks.Add(newTrack);
 
                 currentOffset += (ulong)newTrack.TrackRawBytesPerSector *
                                  ((newTrack.TrackEndSector - newTrack.TrackStartSector) + 1);
             }
 
-            writingStreams = new Dictionary();
+            _writingStreams = new Dictionary();
 
-            if(separateTracksWriting)
-                foreach(Track track in writingTracks)
-                    writingStreams.Add(track.TrackSequence,
-                                       new FileStream(track.TrackFile, FileMode.OpenOrCreate, FileAccess.ReadWrite,
-                                                      FileShare.None));
+            if(_separateTracksWriting)
+                foreach(Track track in _writingTracks)
+                    _writingStreams.Add(track.TrackSequence,
+                                        new FileStream(track.TrackFile, FileMode.OpenOrCreate, FileAccess.ReadWrite,
+                                                       FileShare.None));
             else
             {
-                var jointstream = new FileStream(writingBaseName + ".bin", FileMode.OpenOrCreate, FileAccess.ReadWrite,
+                var jointStream = new FileStream(_writingBaseName + ".bin", FileMode.OpenOrCreate, FileAccess.ReadWrite,
                                                  FileShare.None);
 
-                foreach(Track track in writingTracks)
-                    writingStreams.Add(track.TrackSequence, jointstream);
+                foreach(Track track in _writingTracks)
+                    _writingStreams.Add(track.TrackSequence, jointStream);
             }
 
             return true;
@@ -414,91 +414,118 @@ namespace DiscImageChef.DiscImages
                 return false;
             }
 
-            if(separateTracksWriting)
-                foreach(FileStream writingStream in writingStreams.Values)
+            if(_separateTracksWriting)
+                foreach(FileStream writingStream in _writingStreams.Values)
                 {
                     writingStream.Flush();
                     writingStream.Close();
                 }
             else
             {
-                writingStreams.First().Value.Flush();
-                writingStreams.First().Value.Close();
+                _writingStreams.First().Value.Flush();
+                _writingStreams.First().Value.Close();
             }
 
             int currentSession = 0;
 
-            if(!string.IsNullOrWhiteSpace(discimage.Comment))
+            if(!string.IsNullOrWhiteSpace(_discImage.Comment))
             {
-                string[] commentLines = discimage.Comment.Split(new[]
+                string[] commentLines = _discImage.Comment.Split(new[]
                 {
                     '\n'
                 }, StringSplitOptions.RemoveEmptyEntries);
 
                 foreach(string line in commentLines)
-                    descriptorStream.WriteLine("REM {0}", line);
+                    _descriptorStream.WriteLine("REM {0}", line);
             }
 
-            descriptorStream.WriteLine("REM ORIGINAL MEDIA-TYPE: {0}", MediaTypeToCdrwinType(imageInfo.MediaType));
+            _descriptorStream.WriteLine("REM ORIGINAL MEDIA-TYPE: {0}", MediaTypeToCdrwinType(_imageInfo.MediaType));
 
-            if(!string.IsNullOrEmpty(discimage.Cdtextfile))
-                descriptorStream.WriteLine("CDTEXTFILE \"{0}\"", Path.GetFileName(discimage.Cdtextfile));
+            _descriptorStream.WriteLine("REM METADATA DIC MEDIA-TYPE: {0}", _imageInfo.MediaType);
 
-            if(!string.IsNullOrEmpty(discimage.Title))
-                descriptorStream.WriteLine("TITLE {0}", discimage.Title);
+            if(!string.IsNullOrEmpty(_imageInfo.Application))
+            {
+                _descriptorStream.WriteLine("REM Ripping Tool: {0}", _imageInfo.Application);
 
-            if(!string.IsNullOrEmpty(discimage.Mcn))
-                descriptorStream.WriteLine("CATALOG {0}", discimage.Mcn);
+                if(!string.IsNullOrEmpty(_imageInfo.ApplicationVersion))
+                    _descriptorStream.WriteLine("REM Ripping Tool Version: {0}", _imageInfo.ApplicationVersion);
+            }
 
-            if(!string.IsNullOrEmpty(discimage.Barcode))
-                descriptorStream.WriteLine("UPC_EAN {0}", discimage.Barcode);
+            if(DumpHardware != null)
+            {
+                foreach(var dumpData in from dump in DumpHardware from extent in dump.Extents.OrderBy(e => e.Start)
+                                        select new
+                                        {
+                                            dump.Manufacturer, dump.Model, dump.Firmware, dump.Serial,
+                                            Application        = dump.Software.Name,
+                                            ApplicationVersion = dump.Software.Version, dump.Software.OperatingSystem,
+                                            extent.Start, extent.End
+                                        })
+                {
+                    _descriptorStream.
+                        WriteLine($"REM METADATA DUMP EXTENT: {dumpData.Application} | {dumpData.ApplicationVersion} | {dumpData.OperatingSystem} | {dumpData.Manufacturer} | {dumpData.Model} | {dumpData.Firmware} | {dumpData.Serial} | {dumpData.Start}:{dumpData.End}");
+                }
+            }
 
-            if(!separateTracksWriting)
-                descriptorStream.WriteLine("FILE \"{0}\" BINARY", Path.GetFileName(writingStreams.First().Value.Name));
+            if(!string.IsNullOrEmpty(_discImage.CdTextFile))
+                _descriptorStream.WriteLine("CDTEXTFILE \"{0}\"", Path.GetFileName(_discImage.CdTextFile));
 
-            foreach(Track track in writingTracks)
+            if(!string.IsNullOrEmpty(_discImage.Title))
+                _descriptorStream.WriteLine("TITLE {0}", _discImage.Title);
+
+            if(!string.IsNullOrEmpty(_discImage.Mcn))
+                _descriptorStream.WriteLine("CATALOG {0}", _discImage.Mcn);
+
+            if(!string.IsNullOrEmpty(_discImage.Barcode))
+                _descriptorStream.WriteLine("UPC_EAN {0}", _discImage.Barcode);
+
+            if(!_separateTracksWriting)
+                _descriptorStream.WriteLine("FILE \"{0}\" BINARY",
+                                            Path.GetFileName(_writingStreams.First().Value.Name));
+
+            foreach(Track track in _writingTracks)
             {
                 if(track.TrackSession > currentSession)
-                    descriptorStream.WriteLine("REM SESSION {0}", ++currentSession);
+                    _descriptorStream.WriteLine("REM SESSION {0}", ++currentSession);
 
-                if(separateTracksWriting)
-                    descriptorStream.WriteLine("FILE \"{0}\" BINARY", Path.GetFileName(track.TrackFile));
+                if(_separateTracksWriting)
+                    _descriptorStream.WriteLine("FILE \"{0}\" BINARY", Path.GetFileName(track.TrackFile));
 
                 (byte minute, byte second, byte frame) msf = LbaToMsf(track.TrackStartSector);
-                descriptorStream.WriteLine("  TRACK {0:D2} {1}", track.TrackSequence, GetTrackMode(track));
+                _descriptorStream.WriteLine("  TRACK {0:D2} {1}", track.TrackSequence, GetTrackMode(track));
 
-                if(trackFlags.TryGetValue((byte)track.TrackSequence, out byte flagsByte))
+                if(_trackFlags.TryGetValue((byte)track.TrackSequence, out byte flagsByte))
                     if(flagsByte != 0 &&
                        flagsByte != (byte)CdFlags.DataTrack)
                     {
                         var flags = (CdFlags)flagsByte;
 
-                        descriptorStream.WriteLine("    FLAGS{0}{1}{2}",
-                                                   flags.HasFlag(CdFlags.CopyPermitted) ? " DCP" : "",
-                                                   flags.HasFlag(CdFlags.FourChannel) ? " 4CH" : "",
-                                                   flags.HasFlag(CdFlags.PreEmphasis) ? " PRE" : "");
+                        _descriptorStream.WriteLine("    FLAGS{0}{1}{2}",
+                                                    flags.HasFlag(CdFlags.CopyPermitted) ? " DCP" : "",
+                                                    flags.HasFlag(CdFlags.FourChannel) ? " 4CH" : "",
+                                                    flags.HasFlag(CdFlags.PreEmphasis) ? " PRE" : "");
                     }
 
-                if(trackIsrcs.TryGetValue((byte)track.TrackSequence, out string isrc))
-                    descriptorStream.WriteLine("    ISRC {0}", isrc);
+                if(_trackIsrcs.TryGetValue((byte)track.TrackSequence, out string isrc))
+                    _descriptorStream.WriteLine("    ISRC {0}", isrc);
 
                 if(track.TrackPregap > 0)
                 {
-                    descriptorStream.WriteLine("    INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 0, msf.minute, msf.second,
-                                               msf.frame);
+                    _descriptorStream.WriteLine("    INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 0, msf.minute, msf.second,
+                                                msf.frame);
 
                     msf = LbaToMsf(track.TrackStartSector + track.TrackPregap);
 
-                    descriptorStream.WriteLine("    INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 1, msf.minute, msf.second,
-                                               msf.frame);
+                    _descriptorStream.WriteLine("    INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 1, msf.minute, msf.second,
+                                                msf.frame);
                 }
                 else
-                    descriptorStream.WriteLine("    INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 1, msf.minute, msf.second,
-                                               msf.frame);
+                    _descriptorStream.WriteLine("    INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 1, msf.minute, msf.second,
+                                                msf.frame);
             }
 
-            descriptorStream.Flush();
-            descriptorStream.Close();
+            _descriptorStream.Flush();
+            _descriptorStream.Close();
 
             IsWriting    = false;
             ErrorMessage = "";
@@ -523,8 +550,8 @@ namespace DiscImageChef.DiscImages
             }
 
             Track track =
-                writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
-                                                    sectorAddress <= trk.TrackEndSector);
+                _writingTracks.FirstOrDefault(trk => sectorAddress >= trk.TrackStartSector &&
+                                                     sectorAddress <= trk.TrackEndSector);
 
             if(track.TrackSequence == 0)
             {
@@ -544,14 +571,14 @@ namespace DiscImageChef.DiscImages
                         return false;
                     }
 
-                    trackFlags.Add((byte)track.TrackSequence, data[0]);
+                    _trackFlags.Add((byte)track.TrackSequence, data[0]);
 
                     return true;
                 }
                 case SectorTagType.CdTrackIsrc:
                 {
                     if(data != null)
-                        trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
+                        _trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
 
                     return true;
                 }
@@ -565,15 +592,22 @@ namespace DiscImageChef.DiscImages
         public bool WriteSectorsTag(byte[] data, ulong sectorAddress, uint length, SectorTagType tag) =>
             WriteSectorTag(data, sectorAddress, tag);
 
-        public bool SetDumpHardware(List dumpHardware) => false;
+        public bool SetDumpHardware(List dumpHardware)
+        {
+            DumpHardware = dumpHardware;
+
+            return true;
+        }
 
         public bool SetCicmMetadata(CICMMetadataType metadata) => false;
 
         public bool SetMetadata(ImageInfo metadata)
         {
-            discimage.Barcode = metadata.MediaBarcode;
-            discimage.Comment = metadata.Comments;
-            discimage.Title   = metadata.MediaTitle;
+            _discImage.Barcode            = metadata.MediaBarcode;
+            _discImage.Comment            = metadata.Comments;
+            _discImage.Title              = metadata.MediaTitle;
+            _imageInfo.Application        = metadata.Application;
+            _imageInfo.ApplicationVersion = metadata.ApplicationVersion;
 
             return true;
         }
diff --git a/DiscImageChef.sln.DotSettings b/DiscImageChef.sln.DotSettings
index 1ff89100e..c538e0ffd 100644
--- a/DiscImageChef.sln.DotSettings
+++ b/DiscImageChef.sln.DotSettings
@@ -186,11 +186,20 @@
 	True
 	True
 	True
+	True
+	True
+	True
+	True
 	True
 	True
 	True
 	True
+	True
+	True
+	True
+	True
 	True
+	True
 	True
 	True
 	True
@@ -198,12 +207,25 @@
 	True
 	True
 	True
+	True
 	True
 	True
 	True
 	True
+	True
+	True
+	True
+	True
+	True
+	True
+	True
 	True
 	True
+	True
+	True
+	True
+	True
+	True
 	True
 	True
 	True
@@ -211,9 +233,16 @@
 	True
 	True
 	True
+	True
+	True
+	True
+	True
+	True
 	True
 	True
+	True
 	True
+	True
 	True
 	True
 	True
@@ -242,6 +271,7 @@
 	True
 	True
 	True
+	True
 	True
 	True
 	True
@@ -257,6 +287,7 @@
 	True
 	True
 	True
+	True
 	True
 	True
 	True
@@ -264,6 +295,7 @@
 	True
 	True
 	True
+	True
 	True
 	True
 	True