diff --git a/DataCompressor.iml b/DataCompressor.iml
index fc02b02707b1069a5e54ee78aa8cbd0b3d27ffac..add71798f4dc0699f9f3ae1cd18003ffe51acc6a 100644
--- a/DataCompressor.iml
+++ b/DataCompressor.iml
@@ -1,12 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_10">
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_9">
     <output url="file://$MODULE_DIR$/target/classes" />
     <output-test url="file://$MODULE_DIR$/target/test-classes" />
     <content url="file://$MODULE_DIR$">
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/target" />
     </content>
     <orderEntry type="inheritedJdk" />
@@ -14,7 +13,7 @@
     <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
     <orderEntry type="library" name="Maven: commons-io:commons-io:1.3.2" level="project" />
     <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.4" level="project" />
-    <orderEntry type="library" name="Maven: org.jetbrains:annotations:18.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains:annotations:19.0.0" level="project" />
     <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/src/main/java/azgracompress/DataCompressor.java b/src/main/java/azgracompress/DataCompressor.java
index be30166ac47127da5fb25f4d95b09451959aa4fb..0d9e0b48b34702dc238732c09593b5de2f10bc20 100644
--- a/src/main/java/azgracompress/DataCompressor.java
+++ b/src/main/java/azgracompress/DataCompressor.java
@@ -30,8 +30,8 @@ public class DataCompressor {
         }
 
         ParsedCliOptions parsedCliOptions = new ParsedCliOptions(cmd);
-        if (parsedCliOptions.hasErrorOccured()) {
-            System.err.println(parsedCliOptions.getError());
+        if (parsedCliOptions.parseError()) {
+            System.err.println(parsedCliOptions.getParseError());
             return;
         }
 
diff --git a/src/main/java/azgracompress/benchmark/Benchmark.java b/src/main/java/azgracompress/benchmark/Benchmark.java
index a54814f627d1730ca9df953cab279036128349d6..21af7c41cb2158b9d90d250428acd0a06978d550 100644
--- a/src/main/java/azgracompress/benchmark/Benchmark.java
+++ b/src/main/java/azgracompress/benchmark/Benchmark.java
@@ -31,26 +31,26 @@ public class Benchmark extends BenchmarkBase {
             return;
         }
 
-        boolean dirCreated = new File(options.getOutputFile()).mkdirs();
+        boolean dirCreated = new File(options.getOutputFilePath()).mkdirs();
         //"%d_cb%d.raw.qcmp"
         final String qcmpFilePath = getFileNamePathIntoOutDir(String.format(COMPRESSED_FILE_TEMPLATE,
                                                                             options.getPlaneIndex(),
                                                                             codebookSize));
-        compressOps.setOutputFile(qcmpFilePath);
+        compressOps.setOutputFilePath(qcmpFilePath);
         ImageCompressor compressor = new ImageCompressor(compressOps);
         if (!compressor.compress()) {
             System.err.println("Errors occurred during compression.");
             return;
         }
 
-        decompressOps.setInputFile(qcmpFilePath);
+        decompressOps.setInputFilePath(qcmpFilePath);
 
 
         final String decompressedFile = getFileNamePathIntoOutDir(String.format(QUANTIZED_FILE_TEMPLATE,
                                                                                 options.getPlaneIndex(),
                                                                                 codebookSize));
 
-        decompressOps.setOutputFile(decompressedFile);
+        decompressOps.setOutputFilePath(decompressedFile);
         ImageDecompressor decompressor = new ImageDecompressor(decompressOps);
         if (!decompressor.decompress()) {
             System.err.println("Errors occurred during decompression.");
@@ -58,7 +58,7 @@ public class Benchmark extends BenchmarkBase {
 
         final int[] originalData;
         try {
-            originalData = RawDataIO.loadImageU16(options.getInputFile(),
+            originalData = RawDataIO.loadImageU16(options.getInputFilePath(),
                                                   options.getImageDimension(),
                                                   options.getPlaneIndex()).getData();
         } catch (IOException e) {
diff --git a/src/main/java/azgracompress/benchmark/BenchmarkBase.java b/src/main/java/azgracompress/benchmark/BenchmarkBase.java
index b2777a94e82a2230874aa2bfb6d7583ca9a03fe4..5d272e2f7bfe7c6b77c8421bf0757bcfeed995c9 100644
--- a/src/main/java/azgracompress/benchmark/BenchmarkBase.java
+++ b/src/main/java/azgracompress/benchmark/BenchmarkBase.java
@@ -1,6 +1,7 @@
 package azgracompress.benchmark;
 
 import azgracompress.cli.ParsedCliOptions;
+import azgracompress.compression.Interval;
 import azgracompress.data.ImageU16;
 import azgracompress.data.V3i;
 import azgracompress.io.RawDataIO;
@@ -38,18 +39,18 @@ abstract class BenchmarkBase {
 
     protected BenchmarkBase(final ParsedCliOptions options) {
         this.options = options;
-        this.inputFile = options.getInputFile();
-        this.outputDirectory = options.getOutputFile();
+        this.inputFile = options.getInputFilePath();
+        this.outputDirectory = options.getOutputFilePath();
         this.rawImageDims = options.getImageDimension();
         this.useMiddlePlane = options.shouldUseMiddlePlane();
-        this.codebookSize = (int) Math.pow(2, options.getBitsPerPixel());
+        this.codebookSize = (int) Math.pow(2, options.getBitsPerCodebookIndex());
 
-        if (options.hasPlaneIndexSet()) {
+        if (options.isPlaneIndexSet()) {
             this.planes = new int[]{options.getPlaneIndex()};
-        } else if (options.hasPlaneRangeSet()) {
-            final int from = options.getFromPlaneIndex();
-            final int to = options.getToPlaneIndex();
-            final int count = to - from;
+        } else if (options.isPlaneRangeSet()) {
+            final Interval<Integer> planeRange = options.getPlaneRange();
+            final int from = planeRange.getFrom();
+            final int count = planeRange.getInclusiveTo() - from;
 
             this.planes = new int[count + 1];
             for (int i = 0; i <= count; i++) {
@@ -131,10 +132,9 @@ abstract class BenchmarkBase {
     /**
      * Save both U16 absolute difference image and I32 difference values
      *
-     * @param originalData    Original U16 plane data.
-     * @param transformedData Quantized U16 plane data.
-     * @param diffFile        File storing i32 difference values.
-     * @param absDiffFile     File storing u16 absolute difference values.
+     * @param differenceData Difference data.
+     * @param diffFile       File storing i32 difference values.
+     * @param absDiffFile    File storing u16 absolute difference values.
      * @return True if both files were saved successfully.
      */
     protected boolean saveDifference(final int[] differenceData,
@@ -146,8 +146,8 @@ abstract class BenchmarkBase {
         final String absDiffFilePath = getFileNamePathIntoOutDir(absDiffFile);
 
         ImageU16 img = new ImageU16(rawImageDims.getX(),
-                                    rawImageDims.getY(),
-                                    absDifferenceData);
+                rawImageDims.getY(),
+                absDifferenceData);
         try {
             // NOTE(Moravec): Use little endian so that gnuplot can read the array.
             RawDataIO.writeImageU16(absDiffFilePath, img, true);
@@ -180,9 +180,9 @@ abstract class BenchmarkBase {
 
             for (final QTrainIteration it : trainingLog) {
                 writer.write(String.format("%d;%.5f;%.5f\n",
-                                           it.getIteration(),
-                                           it.getMse(),
-                                           it.getPSNR()));
+                        it.getIteration(),
+                        it.getMse(),
+                        it.getPSNR()));
             }
             writer.flush();
             fileStream.flush();
diff --git a/src/main/java/azgracompress/cli/functions/EntropyCalculation.java b/src/main/java/azgracompress/cli/functions/EntropyCalculation.java
index 5175eed1ad566e249e0963245587fb21c76a4f3d..c7285b01a2a9f6e5cdf200f67fb4b6bf67cedcb7 100644
--- a/src/main/java/azgracompress/cli/functions/EntropyCalculation.java
+++ b/src/main/java/azgracompress/cli/functions/EntropyCalculation.java
@@ -21,11 +21,11 @@ public class EntropyCalculation extends CustomFunctionBase {
     @Override
     public boolean run() {
         ImageU16 plane = null;
-        System.out.println(String.format("Input file: %s", options.getInputFile()));
+        System.out.println(String.format("Input file: %s", options.getInputFilePath()));
 
         for (int planeIndex = 0; planeIndex < options.getImageDimension().getZ(); planeIndex++) {
             try {
-                plane = RawDataIO.loadImageU16(options.getInputFile(),
+                plane = RawDataIO.loadImageU16(options.getInputFilePath(),
                                                options.getImageDimension(),
                                                planeIndex);
             } catch (IOException e) {
diff --git a/src/main/java/azgracompress/compression/CompressorDecompressorBase.java b/src/main/java/azgracompress/compression/CompressorDecompressorBase.java
index 996173e91348e023372e459ff743b9f64fb7ac49..8ab8f5a759bde145550f9ade60ad62b46fa8faa2 100644
--- a/src/main/java/azgracompress/compression/CompressorDecompressorBase.java
+++ b/src/main/java/azgracompress/compression/CompressorDecompressorBase.java
@@ -16,7 +16,7 @@ public abstract class CompressorDecompressorBase {
 
     public CompressorDecompressorBase(ParsedCliOptions options) {
         this.options = options;
-        this.codebookSize = (int) Math.pow(2, this.options.getBitsPerPixel());
+        this.codebookSize = (int) Math.pow(2, this.options.getBitsPerCodebookIndex());
     }
 
     protected int[] createHuffmanSymbols(final int codebookSize) {
@@ -48,12 +48,11 @@ public abstract class CompressorDecompressorBase {
     }
 
     protected int[] getPlaneIndicesForCompression() {
-        if (options.hasPlaneIndexSet()) {
+        if (options.isPlaneIndexSet()) {
             return new int[]{options.getPlaneIndex()};
-        } else if (options.hasPlaneRangeSet()) {
-            final int from = options.getFromPlaneIndex();
-            final int to = options.getToPlaneIndex();
-            final int count = to - from;
+        } else if (options.isPlaneRangeSet()) {
+            final int from = options.getPlaneRange().getFrom();
+            final int count = options.getPlaneRange().getInclusiveTo() - from;
 
             int[] indices = new int[count + 1];
             for (int i = 0; i <= count; i++) {
@@ -117,7 +116,7 @@ public abstract class CompressorDecompressorBase {
     protected long writeHuffmanEncodedIndices(DataOutputStream compressStream,
                                               final Huffman huffman,
                                               final int[] indices) throws ImageCompressionException {
-        try (OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerPixel(), 2048)) {
+        try (OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 2048)) {
             for (final int index : indices) {
                 outBitStream.write(huffman.getCode(index));
             }
diff --git a/src/main/java/azgracompress/compression/ImageCompressor.java b/src/main/java/azgracompress/compression/ImageCompressor.java
index 701725eb1fd07e0fef4d146272f9714ce4b05d88..90db3d2c14d180bbb383a0e0d1c7c5242c0047e6 100644
--- a/src/main/java/azgracompress/compression/ImageCompressor.java
+++ b/src/main/java/azgracompress/compression/ImageCompressor.java
@@ -7,13 +7,10 @@ import azgracompress.fileformat.QCMPFileHeader;
 import java.io.*;
 
 public class ImageCompressor extends CompressorDecompressorBase {
-
     final int PLANE_DATA_SIZES_OFFSET = 23;
-    private final int codebookSize;
 
     public ImageCompressor(ParsedCliOptions options) {
         super(options);
-        codebookSize = (int) Math.pow(2, options.getBitsPerPixel());
     }
 
     /**
@@ -68,7 +65,7 @@ public class ImageCompressor extends CompressorDecompressorBase {
 
         long[] planeDataSizes = null;
 
-        try (FileOutputStream fos = new FileOutputStream(options.getOutputFile(), false);
+        try (FileOutputStream fos = new FileOutputStream(options.getOutputFilePath(), false);
              DataOutputStream compressStream = new DataOutputStream(new BufferedOutputStream(fos, 8192))) {
 
             final QCMPFileHeader header = createHeader();
@@ -92,7 +89,7 @@ public class ImageCompressor extends CompressorDecompressorBase {
             return false;
         }
 
-        try (RandomAccessFile raf = new RandomAccessFile(options.getOutputFile(), "rw")) {
+        try (RandomAccessFile raf = new RandomAccessFile(options.getOutputFilePath(), "rw")) {
             raf.seek(PLANE_DATA_SIZES_OFFSET);
             writePlaneDataSizes(raf, planeDataSizes);
         } catch (IOException ex) {
@@ -126,7 +123,7 @@ public class ImageCompressor extends CompressorDecompressorBase {
 
 
         header.setQuantizationType(options.getQuantizationType());
-        header.setBitsPerPixel((byte) options.getBitsPerPixel());
+        header.setBitsPerCodebookIndex((byte) options.getBitsPerCodebookIndex());
 
         // Codebook per plane is used only if middle plane isn't set nor is the cache folder.
         final boolean oneCodebook = options.shouldUseMiddlePlane() || options.hasCodebookCacheFolder();
diff --git a/src/main/java/azgracompress/compression/ImageDecompressor.java b/src/main/java/azgracompress/compression/ImageDecompressor.java
index a2a5537e2d00c6c4f874fcf04f1f39c5e6a34d0a..ded4d46557e7069933cdf0339f9693d2e0886450 100644
--- a/src/main/java/azgracompress/compression/ImageDecompressor.java
+++ b/src/main/java/azgracompress/compression/ImageDecompressor.java
@@ -61,7 +61,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
         boolean validFile = true;
 
         QCMPFileHeader header = null;
-        try (FileInputStream fileInputStream = new FileInputStream(options.getInputFile());
+        try (FileInputStream fileInputStream = new FileInputStream(options.getInputFilePath());
              DataInputStream dataInputStream = new DataInputStream(fileInputStream)) {
             header = readQCMPFileHeader(dataInputStream);
         } catch (IOException ioEx) {
@@ -97,12 +97,12 @@ public class ImageDecompressor extends CompressorDecompressorBase {
                     logBuilder.append("INVALID\n");
                     break;
             }
-            logBuilder.append("Bits per pixel:\t\t").append(header.getBitsPerPixel()).append('\n');
+            logBuilder.append("Bits per pixel:\t\t").append(header.getBitsPerCodebookIndex()).append('\n');
 
             logBuilder.append("Codebook:\t\t").append(header.isCodebookPerPlane() ? "one per plane\n" : "one for " +
                     "all\n");
 
-            final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel());
+            final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex());
             logBuilder.append("Codebook size:\t\t").append(codebookSize).append('\n');
 
             logBuilder.append("Image size X:\t\t").append(header.getImageSizeX()).append('\n');
@@ -113,7 +113,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
             logBuilder.append("Vector size Y:\t\t").append(header.getVectorSizeY()).append('\n');
             logBuilder.append("Vector size Z:\t\t").append(header.getVectorSizeZ()).append('\n');
 
-            final long fileSize = new File(options.getInputFile()).length();
+            final long fileSize = new File(options.getInputFilePath()).length();
             final long headerSize = header.getHeaderSize();
             final long dataSize = fileSize - headerSize;
 
@@ -167,7 +167,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
 
         final Stopwatch decompressionStopwatch = Stopwatch.startNew();
         final long decompressedFileSize;
-        try (FileInputStream fileInputStream = new FileInputStream(options.getInputFile());
+        try (FileInputStream fileInputStream = new FileInputStream(options.getInputFilePath());
              DataInputStream dataInputStream = new DataInputStream(fileInputStream)) {
 
             final QCMPFileHeader header = readQCMPFileHeader(dataInputStream);
@@ -187,7 +187,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
                 return false;
             }
 
-            final long fileSize = new File(options.getInputFile()).length();
+            final long fileSize = new File(options.getInputFilePath()).length();
             final long dataSize = fileSize - header.getHeaderSize();
             final long expectedDataSize = imageDecompressor.getExpectedDataSize(header);
             if (dataSize != expectedDataSize) {
@@ -195,7 +195,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
                 return false;
             }
 
-            try (FileOutputStream fos = new FileOutputStream(options.getOutputFile(), false);
+            try (FileOutputStream fos = new FileOutputStream(options.getOutputFilePath(), false);
                  DataOutputStream decompressStream = new DataOutputStream(fos)) {
 
                 imageDecompressor.decompress(dataInputStream, decompressStream, header);
diff --git a/src/main/java/azgracompress/compression/Interval.java b/src/main/java/azgracompress/compression/Interval.java
index d0d17b5a7e873ede639eb50a4f1958e35d4b4a5e..f6f2fbfeee1bb93ac6ffae9f171c70052d10095c 100644
--- a/src/main/java/azgracompress/compression/Interval.java
+++ b/src/main/java/azgracompress/compression/Interval.java
@@ -33,7 +33,7 @@ public class Interval<T extends Comparable<T>> {
      * Get inclusive end of the interval.
      * @return Inclusive end of the interval.
      */
-    public T getInclusiveEnd() {
+    public T getInclusiveTo() {
         return to;
     }
 }
diff --git a/src/main/java/azgracompress/compression/SQImageCompressor.java b/src/main/java/azgracompress/compression/SQImageCompressor.java
index 48654a8bc30b33e8fc6e85d768d9ef9ea06b2d47..09efdeacdb381e7ff84a5a8b9d25ca2d10fb6d24 100644
--- a/src/main/java/azgracompress/compression/SQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/SQImageCompressor.java
@@ -30,8 +30,8 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
     private ScalarQuantizer trainScalarQuantizerFromData(final int[] planeData) {
 
         LloydMaxU16ScalarQuantization lloydMax = new LloydMaxU16ScalarQuantization(planeData,
-                                                                                   getCodebookSize(),
-                                                                                   options.getWorkerCount());
+                getCodebookSize(),
+                options.getWorkerCount());
         lloydMax.train(false);
         return new ScalarQuantizer(U16.Min, U16.Max, lloydMax.getCodebook());
     }
@@ -72,7 +72,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
     private ScalarQuantizer loadQuantizerFromCache() throws ImageCompressionException {
         QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getCodebookCacheFolder());
 
-        final SQCodebook codebook = cacheManager.loadSQCodebook(options.getInputFile(), getCodebookSize());
+        final SQCodebook codebook = cacheManager.loadSQCodebook(options.getInputFilePath(), getCodebookSize());
         if (codebook == null) {
             throw new ImageCompressionException("Failed to read quantization values from cache file.");
         }
@@ -104,9 +104,9 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
             ImageU16 middlePlane = null;
             final int middlePlaneIndex = getMiddlePlaneIndex();
             try {
-                middlePlane = RawDataIO.loadImageU16(options.getInputFile(),
-                                                     options.getImageDimension(),
-                                                     getMiddlePlaneIndex());
+                middlePlane = RawDataIO.loadImageU16(options.getInputFilePath(),
+                        options.getImageDimension(),
+                        getMiddlePlaneIndex());
             } catch (Exception ex) {
                 throw new ImageCompressionException("Unable to load plane data.", ex);
             }
@@ -130,9 +130,9 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
             ImageU16 plane = null;
 
             try {
-                plane = RawDataIO.loadImageU16(options.getInputFile(),
-                                               options.getImageDimension(),
-                                               planeIndex);
+                plane = RawDataIO.loadImageU16(options.getInputFilePath(),
+                        options.getImageDimension(),
+                        planeIndex);
             } catch (Exception ex) {
                 throw new ImageCompressionException("Unable to load plane data.", ex);
             }
@@ -152,7 +152,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
             Log("Compressing plane...");
             final int[] indices = quantizer.quantizeIntoIndices(plane.getData(), 1);
 
-            planeDataSizes[planeCounter++] = writeHuffmanEncodedIndices(compressStream,huffman, indices);
+            planeDataSizes[planeCounter++] = writeHuffmanEncodedIndices(compressStream, huffman, indices);
 
             stopwatch.stop();
             Log("Plane time: " + stopwatch.getElapsedTimeString());
@@ -163,20 +163,20 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
 
     private int[] loadConfiguredPlanesData() throws ImageCompressionException {
         int[] trainData = null;
-        if (options.hasPlaneIndexSet()) {
+        if (options.isPlaneIndexSet()) {
             try {
                 Log("Loading single plane data.");
-                trainData = RawDataIO.loadImageU16(options.getInputFile(),
-                                                   options.getImageDimension(),
-                                                   options.getPlaneIndex()).getData();
+                trainData = RawDataIO.loadImageU16(options.getInputFilePath(),
+                        options.getImageDimension(),
+                        options.getPlaneIndex()).getData();
             } catch (IOException e) {
                 throw new ImageCompressionException("Failed to load plane data.", e);
             }
-        } else if (options.hasPlaneRangeSet()) {
+        } else if (options.isPlaneRangeSet()) {
             Log("Loading plane range data.");
             final int[] planes = getPlaneIndicesForCompression();
             try {
-                trainData = RawDataIO.loadPlanesData(options.getInputFile(), options.getImageDimension(), planes);
+                trainData = RawDataIO.loadPlanesData(options.getInputFilePath(), options.getImageDimension(), planes);
             } catch (IOException e) {
                 e.printStackTrace();
                 throw new ImageCompressionException("Failed to load plane range data.", e);
@@ -184,7 +184,7 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
         } else {
             Log("Loading all planes data.");
             try {
-                trainData = RawDataIO.loadAllPlanesData(options.getInputFile(), options.getImageDimension());
+                trainData = RawDataIO.loadAllPlanesData(options.getInputFilePath(), options.getImageDimension());
             } catch (IOException e) {
                 throw new ImageCompressionException("Failed to load all planes data.", e);
             }
@@ -197,18 +197,18 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
         int[] trainData = loadConfiguredPlanesData();
 
         LloydMaxU16ScalarQuantization lloydMax = new LloydMaxU16ScalarQuantization(trainData,
-                                                                                   getCodebookSize(),
-                                                                                   options.getWorkerCount());
+                getCodebookSize(),
+                options.getWorkerCount());
         Log("Starting LloydMax training.");
         lloydMax.train(options.isVerbose());
         final SQCodebook codebook = lloydMax.getCodebook();
         final int[] qValues = codebook.getCentroids();
         Log("Finished LloydMax training.");
 
-        Log(String.format("Saving cache file to %s", options.getOutputFile()));
-        QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFile());
+        Log(String.format("Saving cache file to %s", options.getOutputFilePath()));
+        QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFilePath());
         try {
-            cacheManager.saveCodebook(options.getInputFile(), codebook);
+            cacheManager.saveCodebook(options.getInputFilePath(), codebook);
         } catch (IOException e) {
             throw new ImageCompressionException("Unable to write cache.", e);
         }
diff --git a/src/main/java/azgracompress/compression/SQImageDecompressor.java b/src/main/java/azgracompress/compression/SQImageDecompressor.java
index 1ef5f6ac5cdc349f0605d6977c5fbe94e77484f0..1009794cc160e249ec7d39ed90761fdbe0cd731d 100644
--- a/src/main/java/azgracompress/compression/SQImageDecompressor.java
+++ b/src/main/java/azgracompress/compression/SQImageDecompressor.java
@@ -39,7 +39,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
     @Override
     public long getExpectedDataSize(QCMPFileHeader header) {
         // Quantization value count.
-        final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel());
+        final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex());
 
         // Total codebook size in bytes. Also symbol frequencies for Huffman.
         long codebookDataSize = ((2 * codebookSize) + (LONG_BYTES * codebookSize)) *
@@ -60,12 +60,12 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
                            DataOutputStream decompressStream,
                            QCMPFileHeader header) throws ImageDecompressionException {
 
-        final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel());
+        final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex());
         final int[] huffmanSymbols = createHuffmanSymbols(codebookSize);
         final int planeCountForDecompression = header.getImageSizeZ();
 
         final int planePixelCount = header.getImageSizeX() * header.getImageSizeY();
-        final int planeIndicesDataSize = (int) Math.ceil((planePixelCount * header.getBitsPerPixel()) / 8.0);
+        final int planeIndicesDataSize = (int) Math.ceil((planePixelCount * header.getBitsPerCodebookIndex()) / 8.0);
 
         SQCodebook codebook = null;
         Huffman huffman = null;
@@ -90,7 +90,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
             byte[] decompressedPlaneData = null;
             final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex];
             try (InBitStream inBitStream = new InBitStream(compressedStream,
-                                                           header.getBitsPerPixel(),
+                                                           header.getBitsPerCodebookIndex(),
                                                            planeDataSize)) {
                 inBitStream.readToBuffer();
                 inBitStream.setAllowReadFromUnderlyingStream(false);
diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java
index 9960c8d6a6b32e609c99399f2cd9174b037e5d8d..3b6eb761a384791536559f54c48a4b02be37fbf4 100644
--- a/src/main/java/azgracompress/compression/VQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageCompressor.java
@@ -28,9 +28,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
     private VectorQuantizer trainVectorQuantizerFromPlaneVectors(final int[][] planeVectors) {
 
         LBGVectorQuantizer vqInitializer = new LBGVectorQuantizer(planeVectors,
-                                                                  getCodebookSize(),
-                                                                  options.getWorkerCount(),
-                                                                  options.getVectorDimension().toV3i());
+                getCodebookSize(),
+                options.getWorkerCount(),
+                options.getVectorDimension().toV3i());
         LBGResult vqResult = vqInitializer.findOptimalCodebook(false);
         return new VectorQuantizer(vqResult.getCodebook());
     }
@@ -73,9 +73,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
     private VectorQuantizer loadQuantizerFromCache() throws ImageCompressionException {
         QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getCodebookCacheFolder());
 
-        final VQCodebook codebook = cacheManager.loadVQCodebook(options.getInputFile(),
-                                                                getCodebookSize(),
-                                                                options.getVectorDimension().toV3i());
+        final VQCodebook codebook = cacheManager.loadVQCodebook(options.getInputFilePath(),
+                getCodebookSize(),
+                options.getVectorDimension().toV3i());
         if (codebook == null) {
             throw new ImageCompressionException("Failed to read quantization vectors from cache.");
         }
@@ -110,9 +110,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
             final int middlePlaneIndex = getMiddlePlaneIndex();
             ImageU16 middlePlane = null;
             try {
-                middlePlane = RawDataIO.loadImageU16(options.getInputFile(),
-                                                     options.getImageDimension(),
-                                                     middlePlaneIndex);
+                middlePlane = RawDataIO.loadImageU16(options.getInputFilePath(),
+                        options.getImageDimension(),
+                        middlePlaneIndex);
             } catch (Exception ex) {
                 throw new ImageCompressionException("Unable to load plane data.", ex);
             }
@@ -136,9 +136,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
 
             ImageU16 plane = null;
             try {
-                plane = RawDataIO.loadImageU16(options.getInputFile(),
-                                               options.getImageDimension(),
-                                               planeIndex);
+                plane = RawDataIO.loadImageU16(options.getInputFilePath(),
+                        options.getImageDimension(),
+                        planeIndex);
             } catch (Exception ex) {
                 throw new ImageCompressionException("Unable to load plane data.", ex);
             }
@@ -176,9 +176,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
      * @throws IOException When reading fails.
      */
     private int[][] loadPlaneQuantizationVectors(final int planeIndex) throws IOException {
-        ImageU16 refPlane = RawDataIO.loadImageU16(options.getInputFile(),
-                                                   options.getImageDimension(),
-                                                   planeIndex);
+        ImageU16 refPlane = RawDataIO.loadImageU16(options.getInputFilePath(),
+                options.getImageDimension(),
+                planeIndex);
 
         return refPlane.toQuantizationVectors(options.getVectorDimension());
     }
@@ -188,7 +188,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
         int[][] trainData = null;
         Stopwatch s = new Stopwatch();
         s.start();
-        if (options.hasPlaneIndexSet()) {
+        if (options.isPlaneIndexSet()) {
             Log("VQ: Loading single plane data.");
             try {
                 trainData = loadPlaneQuantizationVectors(options.getPlaneIndex());
@@ -196,7 +196,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
                 throw new ImageCompressionException("Failed to load plane data.", e);
             }
         } else {
-            Log(options.hasPlaneRangeSet() ? "VQ: Loading plane range data." : "VQ: Loading all planes data.");
+
+            Log((options.isPlaneRangeSet()) ? "VQ: Loading plane range data." : "VQ: Loading all planes data.");
             final int[] planeIndices = getPlaneIndicesForCompression();
 
             final int chunkCountPerPlane = Chunk2D.calculateRequiredChunkCountPerPlane(
@@ -214,7 +215,7 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
                     assert (planeVectors.length == chunkCountPerPlane) : "Wrong chunk count per plane";
                 } catch (IOException e) {
                     throw new ImageCompressionException(String.format("Failed to load plane %d image data.",
-                                                                      planeIndex), e);
+                            planeIndex), e);
                 }
 
                 System.arraycopy(planeVectors, 0, trainData, (planeCounter * chunkCountPerPlane), chunkCountPerPlane);
@@ -231,18 +232,18 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
         final int[][] trainingData = loadConfiguredPlanesData();
 
         LBGVectorQuantizer vqInitializer = new LBGVectorQuantizer(trainingData,
-                                                                  getCodebookSize(),
-                                                                  options.getWorkerCount(),
-                                                                  options.getVectorDimension().toV3i());
+                getCodebookSize(),
+                options.getWorkerCount(),
+                options.getVectorDimension().toV3i());
         Log("Starting LBG optimization.");
         LBGResult lbgResult = vqInitializer.findOptimalCodebook(options.isVerbose());
         Log("Learned the optimal codebook.");
 
 
-        Log("Saving cache file to %s", options.getOutputFile());
-        QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFile());
+        Log("Saving cache file to %s", options.getOutputFilePath());
+        QuantizationCacheManager cacheManager = new QuantizationCacheManager(options.getOutputFilePath());
         try {
-            cacheManager.saveCodebook(options.getInputFile(), lbgResult.getCodebook());
+            cacheManager.saveCodebook(options.getInputFilePath(), lbgResult.getCodebook());
         } catch (IOException e) {
             throw new ImageCompressionException("Unable to write VQ cache.", e);
         }
diff --git a/src/main/java/azgracompress/compression/VQImageDecompressor.java b/src/main/java/azgracompress/compression/VQImageDecompressor.java
index f37b1192d15f34efe10a620ba06ffc01caf206ca..e86a980249f505cc502651725c444a892be83850 100644
--- a/src/main/java/azgracompress/compression/VQImageDecompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageDecompressor.java
@@ -78,7 +78,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
     @Override
     public long getExpectedDataSize(QCMPFileHeader header) {
         // Vector count in codebook
-        final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel());
+        final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex());
 
         // Single vector size in bytes.
         assert (header.getVectorSizeZ() == 1);
@@ -102,7 +102,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
     public void decompress(DataInputStream compressedStream,
                            DataOutputStream decompressStream,
                            QCMPFileHeader header) throws ImageDecompressionException {
-        final int codebookSize = (int) Math.pow(2, header.getBitsPerPixel());
+        final int codebookSize = (int) Math.pow(2, header.getBitsPerCodebookIndex());
         assert (header.getVectorSizeZ() == 1);
         final int vectorSize = header.getVectorSizeX() * header.getVectorSizeY() * header.getVectorSizeZ();
         final int planeCountForDecompression = header.getImageSizeZ();
@@ -137,7 +137,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
 
             final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex];
             try (InBitStream inBitStream = new InBitStream(compressedStream,
-                                                           header.getBitsPerPixel(),
+                                                           header.getBitsPerCodebookIndex(),
                                                            planeDataSize)) {
                 inBitStream.readToBuffer();
                 inBitStream.setAllowReadFromUnderlyingStream(false);