diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/CommonTileHandler.java b/src/main/java/ch/fritteli/maze/generator/serialization/CommonTileHandler.java
new file mode 100644
index 0000000..b4051c8
--- /dev/null
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/CommonTileHandler.java
@@ -0,0 +1,100 @@
+package ch.fritteli.maze.generator.serialization;
+
+import ch.fritteli.maze.generator.model.Direction;
+import ch.fritteli.maze.generator.model.Tile;
+import lombok.experimental.UtilityClass;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.EnumSet;
+
+
+/**
+ * Binary format description of a {@link Tile}.<br>
+ * A tile is stored in one byte:
+ * <ul>
+ *     <li>bits 0..2: always 0</li>
+ *     <li>bit 3: 1=solution, 0=not solution</li>
+ *     <li>bits 4..7: encode walls</li>
+ * </ul>
+ * The values for bits 4..7 are as follows:
+ * <pre>
+ * decimal hex bin  border
+ *       0   0 0000 no border
+ *       1   1 0001 top
+ *       2   2 0010 right
+ *       3   3 0011 top+right
+ *       4   4 0100 bottom
+ *       5   5 0101 top+bottom
+ *       6   6 0110 right+bottom
+ *       7   7 0111 top+right+bottom
+ *       8   8 1000 left
+ *       9   9 1001 top+left
+ *      10   a 1010 right+left
+ *      11   b 1011 top+right+left
+ *      12   c 1100 bottom+left
+ *      13   d 1101 top+bottom+left
+ *      14   e 1110 right+bottom+left
+ *      15   f 1111 top+right+bottom+left
+ * </pre>
+ */
+@UtilityClass
+public class CommonTileHandler {
+    private final byte TOP_BIT = 0b0000_0001;
+    private final byte RIGHT_BIT = 0b0000_0010;
+    private final byte BOTTOM_BIT = 0b0000_0100;
+    private final byte LEFT_BIT = 0b0000_1000;
+    private final byte SOLUTION_BIT = 0b0001_0000;
+
+    public byte getBitmaskForTile(@NotNull final Tile tile) {
+        byte bitmask = 0;
+        if (tile.hasWallAt(Direction.TOP)) {
+            bitmask |= TOP_BIT;
+        }
+        if (tile.hasWallAt(Direction.RIGHT)) {
+            bitmask |= RIGHT_BIT;
+        }
+        if (tile.hasWallAt(Direction.BOTTOM)) {
+            bitmask |= BOTTOM_BIT;
+        }
+        if (tile.hasWallAt((Direction.LEFT))) {
+            bitmask |= LEFT_BIT;
+        }
+        if (tile.isSolution()) {
+            bitmask |= SOLUTION_BIT;
+        }
+        return bitmask;
+    }
+
+    @NotNull
+    public Tile getTileForBitmask(final byte bitmask) {
+        final EnumSet<Direction> walls = EnumSet.noneOf(Direction.class);
+        if ((bitmask & TOP_BIT) == TOP_BIT) {
+            walls.add(Direction.TOP);
+        }
+        if ((bitmask & RIGHT_BIT) == RIGHT_BIT) {
+            walls.add(Direction.RIGHT);
+        }
+        if ((bitmask & BOTTOM_BIT) == BOTTOM_BIT) {
+            walls.add(Direction.BOTTOM);
+        }
+        if ((bitmask & LEFT_BIT) == LEFT_BIT) {
+            walls.add(Direction.LEFT);
+        }
+        final boolean solution = (bitmask & SOLUTION_BIT) == SOLUTION_BIT;
+        return createTile(walls, solution);
+    }
+
+    @NotNull
+    private Tile createTile(@NotNull final EnumSet<Direction> walls, boolean solution) {
+        try {
+            final Constructor<Tile> constructor = Tile.class.getDeclaredConstructor(EnumSet.class, Boolean.TYPE);
+            constructor.setAccessible(true);
+            return constructor.newInstance(walls, solution);
+        } catch (@NotNull final NoSuchMethodException | InstantiationException | IllegalAccessException |
+                                InvocationTargetException e) {
+            throw new RuntimeException("Can not deserialize Tile from maze data.", e);
+        }
+    }
+}
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeInputStreamV1.java b/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeInputStreamV1.java
index 3495e5b..5ec5c7c 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeInputStreamV1.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeInputStreamV1.java
@@ -3,6 +3,7 @@ package ch.fritteli.maze.generator.serialization.v1;
 import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Tile;
 import ch.fritteli.maze.generator.serialization.AbstractMazeInputStream;
+import ch.fritteli.maze.generator.serialization.CommonTileHandler;
 import org.jetbrains.annotations.NotNull;
 
 public class MazeInputStreamV1 extends AbstractMazeInputStream {
@@ -13,6 +14,9 @@ public class MazeInputStreamV1 extends AbstractMazeInputStream {
 
     @Override
     public void checkHeader() {
+        // 00 0x1a magic
+        // 01 0xb1 magic
+        // 02 0x01 version
         final byte magic1 = this.readByte();
         if (magic1 != SerializerDeserializerV1.MAGIC_BYTE_1) {
             throw new IllegalArgumentException("Invalid maze data.");
@@ -30,6 +34,10 @@ public class MazeInputStreamV1 extends AbstractMazeInputStream {
     @NotNull
     @Override
     public Maze readMazeData() {
+        // 03..10  random seed number (long)
+        // 11..14  width (int)
+        // 15..18  height (int)
+        // 19..    tiles
         final long randomSeed = this.readLong();
         final int width = this.readInt();
         final int height = this.readInt();
@@ -42,7 +50,7 @@ public class MazeInputStreamV1 extends AbstractMazeInputStream {
         for (int y = 0; y < height; y++) {
             for (int x = 0; x < width; x++) {
                 final byte bitmask = this.readByte();
-                tiles[x][y] = SerializerDeserializerV1.getTileForBitmask(bitmask);
+                tiles[x][y] = CommonTileHandler.getTileForBitmask(bitmask);
             }
         }
 
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeOutputStreamV1.java b/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeOutputStreamV1.java
index 62ecf70..aa8d3c2 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeOutputStreamV1.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v1/MazeOutputStreamV1.java
@@ -3,12 +3,16 @@ package ch.fritteli.maze.generator.serialization.v1;
 import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Tile;
 import ch.fritteli.maze.generator.serialization.AbstractMazeOutputStream;
+import ch.fritteli.maze.generator.serialization.CommonTileHandler;
 import org.jetbrains.annotations.NotNull;
 
 public class MazeOutputStreamV1 extends AbstractMazeOutputStream {
 
     @Override
     public void writeHeader() {
+        // 00 0x1a magic
+        // 01 0xb1 magic
+        // 02 0x02 version
         this.writeByte(SerializerDeserializerV1.MAGIC_BYTE_1);
         this.writeByte(SerializerDeserializerV1.MAGIC_BYTE_2);
         this.writeByte(SerializerDeserializerV1.VERSION_BYTE);
@@ -16,6 +20,10 @@ public class MazeOutputStreamV1 extends AbstractMazeOutputStream {
 
     @Override
     public void writeMazeData(@NotNull final Maze maze) {
+        // 03..10  random seed number (long)
+        // 11..14  width (int)
+        // 15..18  height (int)
+        // 19..    tiles
         final long randomSeed = maze.getRandomSeed();
         final int width = maze.getWidth();
         final int height = maze.getHeight();
@@ -27,7 +35,7 @@ public class MazeOutputStreamV1 extends AbstractMazeOutputStream {
             for (int x = 0; x < width; x++) {
                 // We .get() it, because we want to crash hard if it is not available.
                 final Tile tile = maze.getTileAt(x, y).get();
-                final byte bitmask = SerializerDeserializerV1.getBitmaskForTile(tile);
+                final byte bitmask = CommonTileHandler.getBitmaskForTile(tile);
                 this.writeByte(bitmask);
             }
         }
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1.java b/src/main/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1.java
index fb4a213..f9f02d9 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1.java
@@ -1,6 +1,5 @@
 package ch.fritteli.maze.generator.serialization.v1;
 
-import ch.fritteli.maze.generator.model.Direction;
 import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Tile;
 import lombok.experimental.UtilityClass;
@@ -8,37 +7,17 @@ import org.jetbrains.annotations.NotNull;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.util.EnumSet;
 
 /**
- * <pre>
- * decimal hex bin  border
- *       0   0 0000 no border
- *       1   1 0001 top
- *       2   2 0010 right
- *       3   3 0011 top+right
- *       4   4 0100 bottom
- *       5   5 0101 top+bottom
- *       6   6 0110 right+bottom
- *       7   7 0111 top+right+bottom
- *       8   8 1000 left
- *       9   9 1001 top+left
- *      10   a 1010 right+left
- *      11   b 1011 top+right+left
- *      12   c 1100 bottom+left
- *      13   d 1101 top+bottom+left
- *      14   e 1110 right+bottom+left
- *      15   f 1111 top+right+bottom+left
- * </pre>
- * ==&gt; bits 0..2: always 0; bit 3: 1=solution, 0=not solution; bits 4..7: encode walls ==&gt; first bytes are:
+ * Header bytes are:
  * <pre>
  *   byte  hex meaning
  *     00 0x1a magic
  *     01 0xb1 magic
  *     02 0x01 version (0x00 -> dev, 0x01 -> stable)
- * 03..06      width (int)
- * 07..10      height (int)
- * 11..18      random seed number (long)
+ * 03..10      random seed number (long)
+ * 11..14      width (int)
+ * 15..18      height (int)
  * 19..        tiles
  * </pre>
  * Extraneous space (poss. last nibble) is ignored.
@@ -49,12 +28,6 @@ public class SerializerDeserializerV1 {
     final byte MAGIC_BYTE_2 = (byte) 0xb1;
     final byte VERSION_BYTE = 0x01;
 
-    private final byte TOP_BIT = 0b0000_0001;
-    private final byte RIGHT_BIT = 0b0000_0010;
-    private final byte BOTTOM_BIT = 0b0000_0100;
-    private final byte LEFT_BIT = 0b0000_1000;
-    private final byte SOLUTION_BIT = 0b0001_0000;
-
     /**
      * Serializes the {@code maze} into a byte array.
      *
@@ -93,55 +66,4 @@ public class SerializerDeserializerV1 {
             throw new RuntimeException("Can not deserialize Maze from maze data.", e);
         }
     }
-
-    @NotNull
-    private Tile createTile(@NotNull final EnumSet<Direction> walls, boolean solution) {
-        try {
-            final Constructor<Tile> constructor = Tile.class.getDeclaredConstructor(EnumSet.class, Boolean.TYPE);
-            constructor.setAccessible(true);
-            return constructor.newInstance(walls, solution);
-        } catch (@NotNull final NoSuchMethodException | InstantiationException | IllegalAccessException |
-                                InvocationTargetException e) {
-            throw new RuntimeException("Can not deserialize Tile from maze data.", e);
-        }
-    }
-
-    byte getBitmaskForTile(@NotNull final Tile tile) {
-        byte bitmask = 0;
-        if (tile.hasWallAt(Direction.TOP)) {
-            bitmask |= TOP_BIT;
-        }
-        if (tile.hasWallAt(Direction.RIGHT)) {
-            bitmask |= RIGHT_BIT;
-        }
-        if (tile.hasWallAt(Direction.BOTTOM)) {
-            bitmask |= BOTTOM_BIT;
-        }
-        if (tile.hasWallAt((Direction.LEFT))) {
-            bitmask |= LEFT_BIT;
-        }
-        if (tile.isSolution()) {
-            bitmask |= SOLUTION_BIT;
-        }
-        return bitmask;
-    }
-
-    @NotNull
-    Tile getTileForBitmask(final byte bitmask) {
-        final EnumSet<Direction> walls = EnumSet.noneOf(Direction.class);
-        if ((bitmask & TOP_BIT) == TOP_BIT) {
-            walls.add(Direction.TOP);
-        }
-        if ((bitmask & RIGHT_BIT) == RIGHT_BIT) {
-            walls.add(Direction.RIGHT);
-        }
-        if ((bitmask & BOTTOM_BIT) == BOTTOM_BIT) {
-            walls.add(Direction.BOTTOM);
-        }
-        if ((bitmask & LEFT_BIT) == LEFT_BIT) {
-            walls.add(Direction.LEFT);
-        }
-        final boolean solution = (bitmask & SOLUTION_BIT) == SOLUTION_BIT;
-        return createTile(walls, solution);
-    }
 }
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeInputStreamV2.java b/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeInputStreamV2.java
index de982a6..bbe42b1 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeInputStreamV2.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeInputStreamV2.java
@@ -4,6 +4,7 @@ import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Position;
 import ch.fritteli.maze.generator.model.Tile;
 import ch.fritteli.maze.generator.serialization.AbstractMazeInputStream;
+import ch.fritteli.maze.generator.serialization.CommonTileHandler;
 import org.jetbrains.annotations.NotNull;
 
 public class MazeInputStreamV2 extends AbstractMazeInputStream {
@@ -58,7 +59,7 @@ public class MazeInputStreamV2 extends AbstractMazeInputStream {
         for (int y = 0; y < height; y++) {
             for (int x = 0; x < width; x++) {
                 final byte bitmask = this.readByte();
-                tiles[x][y] = SerializerDeserializerV2.getTileForBitmask(bitmask);
+                tiles[x][y] = CommonTileHandler.getTileForBitmask(bitmask);
             }
         }
 
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeOutputStreamV2.java b/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeOutputStreamV2.java
index b2305fb..c39ad3d 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeOutputStreamV2.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v2/MazeOutputStreamV2.java
@@ -4,6 +4,7 @@ import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Position;
 import ch.fritteli.maze.generator.model.Tile;
 import ch.fritteli.maze.generator.serialization.AbstractMazeOutputStream;
+import ch.fritteli.maze.generator.serialization.CommonTileHandler;
 import org.jetbrains.annotations.NotNull;
 
 public class MazeOutputStreamV2 extends AbstractMazeOutputStream {
@@ -45,7 +46,7 @@ public class MazeOutputStreamV2 extends AbstractMazeOutputStream {
             for (int x = 0; x < width; x++) {
                 // We .get() it, because we want to crash hard if it is not available.
                 final Tile tile = maze.getTileAt(x, y).get();
-                final byte bitmask = SerializerDeserializerV2.getBitmaskForTile(tile);
+                final byte bitmask = CommonTileHandler.getBitmaskForTile(tile);
                 this.writeByte(bitmask);
             }
         }
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v2/SerializerDeserializerV2.java b/src/main/java/ch/fritteli/maze/generator/serialization/v2/SerializerDeserializerV2.java
index 6e7b199..5b7753e 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v2/SerializerDeserializerV2.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v2/SerializerDeserializerV2.java
@@ -1,6 +1,5 @@
 package ch.fritteli.maze.generator.serialization.v2;
 
-import ch.fritteli.maze.generator.model.Direction;
 import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Position;
 import ch.fritteli.maze.generator.model.Tile;
@@ -9,29 +8,9 @@ import org.jetbrains.annotations.NotNull;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.util.EnumSet;
 
 /**
- * <pre>
- * decimal hex bin  border
- *       0   0 0000 no border
- *       1   1 0001 top
- *       2   2 0010 right
- *       3   3 0011 top+right
- *       4   4 0100 bottom
- *       5   5 0101 top+bottom
- *       6   6 0110 right+bottom
- *       7   7 0111 top+right+bottom
- *       8   8 1000 left
- *       9   9 1001 top+left
- *      10   a 1010 right+left
- *      11   b 1011 top+right+left
- *      12   c 1100 bottom+left
- *      13   d 1101 top+bottom+left
- *      14   e 1110 right+bottom+left
- *      15   f 1111 top+right+bottom+left
- * </pre>
- * ==&gt; bits 0..2: always 0; bit 3: 1=solution, 0=not solution; bits 4..7: encode walls ==&gt; first bytes are:
+ * Header bytes are:
  * <pre>
  *   byte  hex meaning
  *     00 0x1a magic
@@ -55,12 +34,6 @@ public class SerializerDeserializerV2 {
     final byte MAGIC_BYTE_2 = (byte) 0xb1;
     final byte VERSION_BYTE = 0x02;
 
-    private final byte TOP_BIT = 0b0000_0001;
-    private final byte RIGHT_BIT = 0b0000_0010;
-    private final byte BOTTOM_BIT = 0b0000_0100;
-    private final byte LEFT_BIT = 0b0000_1000;
-    private final byte SOLUTION_BIT = 0b0001_0000;
-
     /**
      * Serializes the {@code maze} into a byte array.
      *
@@ -99,55 +72,4 @@ public class SerializerDeserializerV2 {
             throw new RuntimeException("Can not deserialize Maze from maze data.", e);
         }
     }
-
-    @NotNull
-    private Tile createTile(@NotNull final EnumSet<Direction> walls, boolean solution) {
-        try {
-            final Constructor<Tile> constructor = Tile.class.getDeclaredConstructor(EnumSet.class, Boolean.TYPE);
-            constructor.setAccessible(true);
-            return constructor.newInstance(walls, solution);
-        } catch (@NotNull final NoSuchMethodException | InstantiationException | IllegalAccessException |
-                                InvocationTargetException e) {
-            throw new RuntimeException("Can not deserialize Tile from maze data.", e);
-        }
-    }
-
-    byte getBitmaskForTile(@NotNull final Tile tile) {
-        byte bitmask = 0;
-        if (tile.hasWallAt(Direction.TOP)) {
-            bitmask |= TOP_BIT;
-        }
-        if (tile.hasWallAt(Direction.RIGHT)) {
-            bitmask |= RIGHT_BIT;
-        }
-        if (tile.hasWallAt(Direction.BOTTOM)) {
-            bitmask |= BOTTOM_BIT;
-        }
-        if (tile.hasWallAt((Direction.LEFT))) {
-            bitmask |= LEFT_BIT;
-        }
-        if (tile.isSolution()) {
-            bitmask |= SOLUTION_BIT;
-        }
-        return bitmask;
-    }
-
-    @NotNull
-    Tile getTileForBitmask(final byte bitmask) {
-        final EnumSet<Direction> walls = EnumSet.noneOf(Direction.class);
-        if ((bitmask & TOP_BIT) == TOP_BIT) {
-            walls.add(Direction.TOP);
-        }
-        if ((bitmask & RIGHT_BIT) == RIGHT_BIT) {
-            walls.add(Direction.RIGHT);
-        }
-        if ((bitmask & BOTTOM_BIT) == BOTTOM_BIT) {
-            walls.add(Direction.BOTTOM);
-        }
-        if ((bitmask & LEFT_BIT) == LEFT_BIT) {
-            walls.add(Direction.LEFT);
-        }
-        final boolean solution = (bitmask & SOLUTION_BIT) == SOLUTION_BIT;
-        return createTile(walls, solution);
-    }
 }
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeInputStreamV3.java b/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeInputStreamV3.java
index 1814008..af809b9 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeInputStreamV3.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeInputStreamV3.java
@@ -4,6 +4,7 @@ import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Position;
 import ch.fritteli.maze.generator.model.Tile;
 import ch.fritteli.maze.generator.serialization.AbstractMazeInputStream;
+import ch.fritteli.maze.generator.serialization.CommonTileHandler;
 import org.jetbrains.annotations.NotNull;
 
 import java.io.IOException;
@@ -66,7 +67,7 @@ public class MazeInputStreamV3 extends AbstractMazeInputStream {
         for (int y = 0; y < height; y++) {
             for (int x = 0; x < width; x++) {
                 final byte bitmask = this.readByte();
-                tiles[x][y] = SerializerDeserializerV3.getTileForBitmask(bitmask);
+                tiles[x][y] = CommonTileHandler.getTileForBitmask(bitmask);
             }
         }
 
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeOutputStreamV3.java b/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeOutputStreamV3.java
index 52b154a..891f0bb 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeOutputStreamV3.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v3/MazeOutputStreamV3.java
@@ -4,6 +4,7 @@ import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Position;
 import ch.fritteli.maze.generator.model.Tile;
 import ch.fritteli.maze.generator.serialization.AbstractMazeOutputStream;
+import ch.fritteli.maze.generator.serialization.CommonTileHandler;
 import org.jetbrains.annotations.NotNull;
 
 import java.nio.charset.StandardCharsets;
@@ -52,7 +53,7 @@ public class MazeOutputStreamV3 extends AbstractMazeOutputStream {
             for (int x = 0; x < width; x++) {
                 // We .get() it, because we want to crash hard if it is not available.
                 final Tile tile = maze.getTileAt(x, y).get();
-                final byte bitmask = SerializerDeserializerV3.getBitmaskForTile(tile);
+                final byte bitmask = CommonTileHandler.getBitmaskForTile(tile);
                 this.writeByte(bitmask);
             }
         }
diff --git a/src/main/java/ch/fritteli/maze/generator/serialization/v3/SerializerDeserializerV3.java b/src/main/java/ch/fritteli/maze/generator/serialization/v3/SerializerDeserializerV3.java
index 839e588..ac9375d 100644
--- a/src/main/java/ch/fritteli/maze/generator/serialization/v3/SerializerDeserializerV3.java
+++ b/src/main/java/ch/fritteli/maze/generator/serialization/v3/SerializerDeserializerV3.java
@@ -1,6 +1,5 @@
 package ch.fritteli.maze.generator.serialization.v3;
 
-import ch.fritteli.maze.generator.model.Direction;
 import ch.fritteli.maze.generator.model.Maze;
 import ch.fritteli.maze.generator.model.Position;
 import ch.fritteli.maze.generator.model.Tile;
@@ -10,29 +9,9 @@ import org.jetbrains.annotations.NotNull;
 import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.util.EnumSet;
 
 /**
- * <pre>
- * decimal hex bin  border
- *       0   0 0000 no border
- *       1   1 0001 top
- *       2   2 0010 right
- *       3   3 0011 top+right
- *       4   4 0100 bottom
- *       5   5 0101 top+bottom
- *       6   6 0110 right+bottom
- *       7   7 0111 top+right+bottom
- *       8   8 1000 left
- *       9   9 1001 top+left
- *      10   a 1010 right+left
- *      11   b 1011 top+right+left
- *      12   c 1100 bottom+left
- *      13   d 1101 top+bottom+left
- *      14   e 1110 right+bottom+left
- *      15   f 1111 top+right+bottom+left
- * </pre>
- * ==&gt; bits 0..2: always 0; bit 3: 1=solution, 0=not solution; bits 4..7: encode walls ==&gt; first bytes are:
+ * Header bytes are:
  * <pre>
  *   byte     hex    meaning
  *     00     0x1a   magic
@@ -58,12 +37,6 @@ public class SerializerDeserializerV3 {
     final byte MAGIC_BYTE_2 = (byte) 0xb1;
     final byte VERSION_BYTE = 0x03;
 
-    private final byte TOP_BIT = 0b0000_0001;
-    private final byte RIGHT_BIT = 0b0000_0010;
-    private final byte BOTTOM_BIT = 0b0000_0100;
-    private final byte LEFT_BIT = 0b0000_1000;
-    private final byte SOLUTION_BIT = 0b0001_0000;
-
     /**
      * Serializes the {@code maze} into a byte array.
      *
@@ -116,55 +89,4 @@ public class SerializerDeserializerV3 {
             throw new RuntimeException("Can not deserialize Maze from maze data.", e);
         }
     }
-
-    @NotNull
-    private Tile createTile(@NotNull final EnumSet<Direction> walls, boolean solution) {
-        try {
-            final Constructor<Tile> constructor = Tile.class.getDeclaredConstructor(EnumSet.class, Boolean.TYPE);
-            constructor.setAccessible(true);
-            return constructor.newInstance(walls, solution);
-        } catch (@NotNull final NoSuchMethodException | InstantiationException | IllegalAccessException |
-                                InvocationTargetException e) {
-            throw new RuntimeException("Can not deserialize Tile from maze data.", e);
-        }
-    }
-
-    byte getBitmaskForTile(@NotNull final Tile tile) {
-        byte bitmask = 0;
-        if (tile.hasWallAt(Direction.TOP)) {
-            bitmask |= TOP_BIT;
-        }
-        if (tile.hasWallAt(Direction.RIGHT)) {
-            bitmask |= RIGHT_BIT;
-        }
-        if (tile.hasWallAt(Direction.BOTTOM)) {
-            bitmask |= BOTTOM_BIT;
-        }
-        if (tile.hasWallAt((Direction.LEFT))) {
-            bitmask |= LEFT_BIT;
-        }
-        if (tile.isSolution()) {
-            bitmask |= SOLUTION_BIT;
-        }
-        return bitmask;
-    }
-
-    @NotNull
-    Tile getTileForBitmask(final byte bitmask) {
-        final EnumSet<Direction> walls = EnumSet.noneOf(Direction.class);
-        if ((bitmask & TOP_BIT) == TOP_BIT) {
-            walls.add(Direction.TOP);
-        }
-        if ((bitmask & RIGHT_BIT) == RIGHT_BIT) {
-            walls.add(Direction.RIGHT);
-        }
-        if ((bitmask & BOTTOM_BIT) == BOTTOM_BIT) {
-            walls.add(Direction.BOTTOM);
-        }
-        if ((bitmask & LEFT_BIT) == LEFT_BIT) {
-            walls.add(Direction.LEFT);
-        }
-        final boolean solution = (bitmask & SOLUTION_BIT) == SOLUTION_BIT;
-        return createTile(walls, solution);
-    }
 }