diff --git a/src/main/java/azgracompress/compression/SQImageCompressor.java b/src/main/java/azgracompress/compression/SQImageCompressor.java
index cc52ed9d950f9e16cc85ba7a19c9a4527c0bb20c..2181a7a58b079859dd9548c4a84e7a5828fb998d 100644
--- a/src/main/java/azgracompress/compression/SQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/SQImageCompressor.java
@@ -7,6 +7,7 @@ import azgracompress.io.OutBitStream;
 import azgracompress.io.RawDataIO;
 import azgracompress.quantization.scalar.LloydMaxU16ScalarQuantization;
 import azgracompress.quantization.scalar.ScalarQuantizer;
+import azgracompress.utilities.Stopwatch;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -55,19 +56,23 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
      */
     public void compress(DataOutputStream compressStream) throws Exception {
         ScalarQuantizer quantizer = null;
+        Stopwatch stopwatch = new Stopwatch();
         if (options.hasReferencePlaneIndex()) {
+            stopwatch.restart();
             final ImageU16 referencePlane = RawDataIO.loadImageU16(options.getInputFile(),
                                                                    options.getImageDimension(),
                                                                    options.getReferencePlaneIndex());
 
             Log(String.format("Training scalar quantizer from reference plane %d.", options.getReferencePlaneIndex()));
             quantizer = trainScalarQuantizerFromData(referencePlane.getData());
+            stopwatch.stop();
             writeCodebookToOutputStream(quantizer, compressStream);
+            Log("Reference codebook created in: " + stopwatch.getElapsedTimeString());
         }
 
         final int[] planeIndices = getPlaneIndicesForCompression();
-
         for (final int planeIndex : planeIndices) {
+            stopwatch.restart();
             Log(String.format("Loading plane %d.", planeIndex));
             final ImageU16 plane = RawDataIO.loadImageU16(options.getInputFile(),
                                                           options.getImageDimension(),
@@ -89,7 +94,8 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
             } catch (IOException ioEx) {
                 ioEx.printStackTrace();
             }
-
+            stopwatch.stop();
+            Log("Plane time: " + stopwatch.getElapsedTimeString());
             Log(String.format("Finished processing of plane %d", planeIndex));
         }
     }
diff --git a/src/main/java/azgracompress/compression/SQImageDecompressor.java b/src/main/java/azgracompress/compression/SQImageDecompressor.java
index d12566dd8fa3add22453506507c00d1779561a8b..0c6cbea4899fcd294732663aea27c56d44638569 100644
--- a/src/main/java/azgracompress/compression/SQImageDecompressor.java
+++ b/src/main/java/azgracompress/compression/SQImageDecompressor.java
@@ -3,6 +3,7 @@ package azgracompress.compression;
 import azgracompress.cli.ParsedCliOptions;
 import azgracompress.fileformat.QCMPFileHeader;
 import azgracompress.io.InBitStream;
+import azgracompress.utilities.Stopwatch;
 import azgracompress.utilities.TypeConverter;
 
 import java.io.DataInputStream;
@@ -57,8 +58,9 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
             quantizationValues = readScalarQuantizationValues(compressedStream, codebookSize);
         }
 
-
+        Stopwatch stopwatch = new Stopwatch();
         for (int planeIndex = 0; planeIndex < planeCountForDecompression; planeIndex++) {
+            stopwatch.restart();
             if (header.isCodebookPerPlane()) {
                 Log("Loading plane codebook...");
                 quantizationValues = readScalarQuantizationValues(compressedStream, codebookSize);
@@ -78,7 +80,8 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
             final byte[] decompressedPlaneData = TypeConverter.unsignedShortArrayToByteArray(decompressedValues, false);
 
             decompressStream.write(decompressedPlaneData);
-            Log(String.format("Decompressed plane %d.", planeIndex));
+            stopwatch.stop();
+            Log(String.format("Decompressed plane %d in %s.", planeIndex, stopwatch.getElapsedTimeString()));
         }
 
     }
diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java
index 853b61767513eaf92fa8a25e6dd9f9fc1a2936e9..312cb18f542e2319a62c2228df6bda6dd7ef7dc6 100644
--- a/src/main/java/azgracompress/compression/VQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageCompressor.java
@@ -10,6 +10,7 @@ import azgracompress.quantization.vector.CodebookEntry;
 import azgracompress.quantization.vector.LBGResult;
 import azgracompress.quantization.vector.LBGVectorQuantizer;
 import azgracompress.quantization.vector.VectorQuantizer;
+import azgracompress.utilities.Stopwatch;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -79,7 +80,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
      */
     public void compress(DataOutputStream compressStream) throws Exception {
         VectorQuantizer quantizer = null;
+        Stopwatch stopwatch = new Stopwatch();
         if (options.hasReferencePlaneIndex()) {
+            stopwatch.restart();
             final ImageU16 referencePlane = RawDataIO.loadImageU16(options.getInputFile(),
                                                                    options.getImageDimension(),
                                                                    options.getReferencePlaneIndex());
@@ -88,12 +91,15 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
             final int[][] refPlaneVectors = getPlaneVectors(referencePlane);
             quantizer = trainVectorQuantizerFromPlaneVectors(refPlaneVectors);
             writeQuantizerToCompressStream(quantizer, compressStream);
-            Log("Wrote reference codebook.");
+            stopwatch.stop();
+            Log("Reference codebook created in: " + stopwatch.getElapsedTimeString());
         }
 
         final int[] planeIndices = getPlaneIndicesForCompression();
 
+
         for (final int planeIndex : planeIndices) {
+            stopwatch.restart();
             Log(String.format("Loading plane %d.", planeIndex));
             final ImageU16 plane = RawDataIO.loadImageU16(options.getInputFile(),
                                                           options.getImageDimension(),
@@ -118,6 +124,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
             } catch (IOException ioEx) {
                 ioEx.printStackTrace();
             }
+            stopwatch.stop();
+            Log("Plane time: " + stopwatch.getElapsedTimeString());
             Log(String.format("Finished processing of plane %d.", planeIndex));
         }
     }
diff --git a/src/main/java/azgracompress/compression/VQImageDecompressor.java b/src/main/java/azgracompress/compression/VQImageDecompressor.java
index 03913c97c8def7b12ada65924f704f081ebd9be1..c124cbadb4ea887f8a4b44d27b3025cfa9343c96 100644
--- a/src/main/java/azgracompress/compression/VQImageDecompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageDecompressor.java
@@ -4,6 +4,7 @@ import azgracompress.cli.ParsedCliOptions;
 import azgracompress.data.*;
 import azgracompress.fileformat.QCMPFileHeader;
 import azgracompress.io.InBitStream;
+import azgracompress.utilities.Stopwatch;
 import azgracompress.utilities.TypeConverter;
 
 import java.io.DataInputStream;
@@ -103,8 +104,9 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
             quantizationVectors = readCodebookVectors(compressedStream, codebookSize, vectorSize);
         }
 
-
+        Stopwatch stopwatch = new Stopwatch();
         for (int planeIndex = 0; planeIndex < planeCountForDecompression; planeIndex++) {
+            stopwatch.restart();
             if (header.isCodebookPerPlane()) {
                 Log("Loading plane codebook...");
                 quantizationVectors = readCodebookVectors(compressedStream, codebookSize, vectorSize);
@@ -134,7 +136,8 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
                     decompressedPlane.getData(),
                     false);
             decompressStream.write(decompressedPlaneData);
-            Log(String.format("Decompressed plane %d.", planeIndex));
+            stopwatch.stop();
+            Log(String.format("Decompressed plane %d in %s.", planeIndex, stopwatch.getElapsedTimeString()));
         }
 
     }
diff --git a/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java b/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java
index 71d8f4e9d1794d2099f7b1ae60fa546d0d54c310..a927146b6db65753886fa83a3dae4ef0c9d6aef9 100644
--- a/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java
+++ b/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java
@@ -316,7 +316,7 @@ public class LBGVectorQuantizer {
         biggestPartition.removeTrainingVectorAndDistance(randomIndex);
 
         // Redistribute biggest partition training vectors
-        @SuppressWarnings("unchecked") final ArrayList<int[]> partitionVectors =
+        final ArrayList<int[]> partitionVectors =
                 (ArrayList<int[]>) biggestPartition.getTrainingVectors().clone();
 
         biggestPartition.clearTrainingData();
diff --git a/src/main/java/azgracompress/utilities/Stopwatch.java b/src/main/java/azgracompress/utilities/Stopwatch.java
index 53692fa1156a4ba650e87e4c2c3c409b8069c3ac..fc695d084062701fa1ea2a7a83193d8f98b23219 100644
--- a/src/main/java/azgracompress/utilities/Stopwatch.java
+++ b/src/main/java/azgracompress/utilities/Stopwatch.java
@@ -41,7 +41,8 @@ public class Stopwatch {
         if (elapsed == null) {
             return "No time measured yet.";
         }
-        return String.format("%dH %dMin %d Sec %d Ms", elapsed.toHoursPart(), elapsed.toMinutesPart(), elapsed.toSecondsPart(), elapsed.toMillisPart());
+        return String.format("%dH %dmin %dsec %dms %dns", elapsed.toHoursPart(), elapsed.toMinutesPart(), elapsed.toSecondsPart(), elapsed.toMillisPart(), elapsed.toNanosPart());
+
     }
 
     @Override