diff --git a/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java
index 3ff365c7ffa561f2537a560ada0af38796db6060..7ff58e137913f5fb91c67be64df39ebf8f1a1cf4 100644
--- a/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/ImageCompressor.java
@@ -217,6 +217,7 @@ public class ImageCompressor extends CompressorDecompressorBase {
      * @return Valid QCMPFile header for compressed file.
      */
     private QCMPFileHeader createHeader() {
+        // TODO(Moravec): Change header to newer version!
         final QCMPFileHeader header = new QCMPFileHeader();
 
 
diff --git a/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java
index aee6464408d39c2e7b023b2e788da1d737a0514a..2a5e8f0f5d52bea5d37c6964c97f61b848d8b737 100644
--- a/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/SQImageCompressor.java
@@ -7,6 +7,7 @@ import cz.it4i.qcmp.cache.SqQvcFile;
 import cz.it4i.qcmp.compression.exception.ImageCompressionException;
 import cz.it4i.qcmp.huffman.HuffmanEncoder;
 import cz.it4i.qcmp.io.InputData;
+import cz.it4i.qcmp.io.OutBitStream;
 import cz.it4i.qcmp.io.loader.IPlaneLoader;
 import cz.it4i.qcmp.io.loader.PlaneLoaderFactory;
 import cz.it4i.qcmp.quantization.scalar.LloydMaxU16ScalarQuantization;
@@ -59,14 +60,15 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm
                                              final DataOutputStream compressStream) throws ImageCompressionException {
         final SQCodebook codebook = quantizer.getCodebook();
         final int[] centroids = codebook.getCentroids();
-        final long[] frequencies = codebook.getSymbolFrequencies();
         try {
             for (final int quantizationValue : centroids) {
                 compressStream.writeShort(quantizationValue);
             }
-            for (final long symbolFrequency : frequencies) {
-                compressStream.writeLong(symbolFrequency);
+
+            try (final OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 32)) {
+                codebook.getHuffmanTreeRoot().writeToBinaryStream(outBitStream);
             }
+
         } catch (final IOException ioEx) {
             throw new ImageCompressionException("Unable to write codebook to compress stream.", ioEx);
         }
diff --git a/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java
index e3433a4d1a529e8173606ab57cbbac5cfe5fa802..a7c3c42b234031aeab669841302e165539085e17 100644
--- a/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/SQImageDecompressor.java
@@ -30,6 +30,7 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I
             for (int i = 0; i < codebookSize; i++) {
                 quantizationValues[i] = compressedStream.readUnsignedShort();
             }
+            // TODO(Moravec): Read frequencies or binary huffman tree based on file format version!!!
             for (int i = 0; i < codebookSize; i++) {
                 symbolFrequencies[i] = compressedStream.readLong();
             }
diff --git a/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java b/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java
index 0bdd52f343e1ed1263e3872355885ac5efb5b71c..0c8c112da67a467bd71b1bd8ed7502bc6e253dcc 100644
--- a/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/VQImageCompressor.java
@@ -8,6 +8,7 @@ import cz.it4i.qcmp.data.Range;
 import cz.it4i.qcmp.fileformat.QuantizationType;
 import cz.it4i.qcmp.huffman.HuffmanEncoder;
 import cz.it4i.qcmp.io.InputData;
+import cz.it4i.qcmp.io.OutBitStream;
 import cz.it4i.qcmp.io.loader.IPlaneLoader;
 import cz.it4i.qcmp.io.loader.PlaneLoaderFactory;
 import cz.it4i.qcmp.quantization.vector.LBGResult;
@@ -72,7 +73,6 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
      */
     private void writeQuantizerToCompressStream(final VectorQuantizer quantizer,
                                                 final DataOutputStream compressStream) throws ImageCompressionException {
-        // TODO
         final int[][] codebook = quantizer.getCodebookVectors();
         try {
             for (final int[] entry : codebook) {
@@ -80,9 +80,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
                     compressStream.writeShort(vecVal);
                 }
             }
-            final long[] frequencies = quantizer.getFrequencies();
-            for (final long symbolFrequency : frequencies) {
-                compressStream.writeLong(symbolFrequency);
+            try (final OutBitStream outBitStream = new OutBitStream(compressStream, options.getBitsPerCodebookIndex(), 32)) {
+                quantizer.getCodebook().getHuffmanTreeRoot().writeToBinaryStream(outBitStream);
             }
         } catch (final IOException ioEx) {
             throw new ImageCompressionException("Unable to write codebook to compress stream.", ioEx);
diff --git a/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java
index 65af70fe3057f6ee6ddce0c808e0b5528aaf8ce4..87bc9c7e3f1c3a9c245940c6a0fba45d85a69e3a 100644
--- a/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/VQImageDecompressor.java
@@ -56,6 +56,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
                     codebookVectors[codebookIndex][vecIndex] = compressedStream.readUnsignedShort();
                 }
             }
+            // TODO(Moravec): Read frequencies or binary huffman tree based on file format version!!!
             for (int codebookIndex = 0; codebookIndex < codebookSize; codebookIndex++) {
                 frequencies[codebookIndex] = compressedStream.readLong();
             }