diff --git a/src/main/java/ch/fritteli/maze/generator/algorithm/Wilson.java b/src/main/java/ch/fritteli/maze/generator/algorithm/Wilson.java
index e53acce..af55d7e 100644
--- a/src/main/java/ch/fritteli/maze/generator/algorithm/Wilson.java
+++ b/src/main/java/ch/fritteli/maze/generator/algorithm/Wilson.java
@@ -86,6 +86,21 @@ public class Wilson extends AbstractMazeGeneratorAlgorithm {
         direction = determineDirectionForDigging(maze.getEnd());
         t = maze.getEndTile();
         this.digTo(t, direction);
+        // seal all walls, mark all as visited
+        for (int x = 0; x < maze.getWidth(); x++) {
+            for (int y = 0; y < maze.getHeight(); y++) {
+                maze.getTileAt(x, y).forEach(tile -> {
+                    Stream.of(Direction.values())
+                            .forEach(d -> {
+                                if (tile.hasWallAt(d)) {
+                                    tile.preventDiggingToOrFrom(d);
+                                } else {
+                                    tile.digFrom(d);
+                                }
+                            });
+                });
+            }
+        }
     }
 
     @Nullable
diff --git a/src/test/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1Test.java b/src/test/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1Test.java
index 2fd819b..4d8a392 100644
--- a/src/test/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1Test.java
+++ b/src/test/java/ch/fritteli/maze/generator/serialization/v1/SerializerDeserializerV1Test.java
@@ -13,6 +13,8 @@ class SerializerDeserializerV1Test {
         new RandomDepthFirst(expected).run();
         final byte[] bytes = SerializerDeserializerV1.serialize(expected);
         final Maze result = SerializerDeserializerV1.deserialize(bytes);
+        assertThat(result.getAlgorithm()).isNull();
+        expected.setAlgorithm(null);
         assertThat(result).isEqualTo(expected);
     }
 
@@ -22,6 +24,8 @@ class SerializerDeserializerV1Test {
         new RandomDepthFirst(expected).run();
         final byte[] bytes = SerializerDeserializerV1.serialize(expected);
         final Maze result = SerializerDeserializerV1.deserialize(bytes);
+        assertThat(result.getAlgorithm()).isNull();
+        expected.setAlgorithm(null);
         assertThat(result).isEqualTo(expected);
     }
 
@@ -31,6 +35,8 @@ class SerializerDeserializerV1Test {
         new RandomDepthFirst(expected).run();
         final byte[] bytes = SerializerDeserializerV1.serialize(expected);
         final Maze result = SerializerDeserializerV1.deserialize(bytes);
+        assertThat(result.getAlgorithm()).isNull();
+        expected.setAlgorithm(null);
         assertThat(result).isEqualTo(expected);
     }
 }
diff --git a/src/test/java/ch/fritteli/maze/generator/serialization/v2/SerializerDeserializerV2Test.java b/src/test/java/ch/fritteli/maze/generator/serialization/v2/SerializerDeserializerV2Test.java
new file mode 100644
index 0000000..c4898c7
--- /dev/null
+++ b/src/test/java/ch/fritteli/maze/generator/serialization/v2/SerializerDeserializerV2Test.java
@@ -0,0 +1,46 @@
+package ch.fritteli.maze.generator.serialization.v2;
+
+import ch.fritteli.maze.generator.algorithm.RandomDepthFirst;
+import ch.fritteli.maze.generator.algorithm.Wilson;
+import ch.fritteli.maze.generator.model.Maze;
+import ch.fritteli.maze.generator.model.Position;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class SerializerDeserializerV2Test {
+    @Test
+    void testSerializeDeserializeTiny() throws IOException {
+        final Maze expected = new Maze(2, 2, 255, new Position(0, 0), new Position(1, 1));
+        new RandomDepthFirst(expected).run();
+        final byte[] bytes = SerializerDeserializerV2.serialize(expected);
+        final Maze result = SerializerDeserializerV2.deserialize(bytes);
+        assertThat(result.getAlgorithm()).isNull();
+        expected.setAlgorithm(null);
+        assertThat(result).isEqualTo(expected);
+    }
+
+    @Test
+    void testSerializeDeserializeMedium() throws IOException {
+        final Maze expected = new Maze(20, 20, -271828182846L);
+        new Wilson(expected).run();
+        final byte[] bytes = SerializerDeserializerV2.serialize(expected);
+        final Maze result = SerializerDeserializerV2.deserialize(bytes);
+        assertThat(result.getAlgorithm()).isNull();
+        expected.setAlgorithm(null);
+        assertThat(result).isEqualTo(expected);
+    }
+
+    @Test
+    void testSerializeDeserializeLarge() throws IOException {
+        final Maze expected = new Maze(200, 320, 3141592653589793238L);
+        new Wilson(expected).run();
+        final byte[] bytes = SerializerDeserializerV2.serialize(expected);
+        final Maze result = SerializerDeserializerV2.deserialize(bytes);
+        assertThat(result.getAlgorithm()).isNull();
+        expected.setAlgorithm(null);
+        assertThat(result).isEqualTo(expected);
+    }
+}
diff --git a/src/test/java/ch/fritteli/maze/generator/serialization/v3/SerializerDeserializerV3Test.java b/src/test/java/ch/fritteli/maze/generator/serialization/v3/SerializerDeserializerV3Test.java
new file mode 100644
index 0000000..fde2008
--- /dev/null
+++ b/src/test/java/ch/fritteli/maze/generator/serialization/v3/SerializerDeserializerV3Test.java
@@ -0,0 +1,40 @@
+package ch.fritteli.maze.generator.serialization.v3;
+
+import ch.fritteli.maze.generator.algorithm.RandomDepthFirst;
+import ch.fritteli.maze.generator.algorithm.Wilson;
+import ch.fritteli.maze.generator.model.Maze;
+import ch.fritteli.maze.generator.model.Position;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class SerializerDeserializerV3Test {
+    @Test
+    void testSerializeDeserializeTiny() throws IOException {
+        final Maze expected = new Maze(2, 2, 255, new Position(0, 0), new Position(1, 1));
+        new RandomDepthFirst(expected).run();
+        final byte[] bytes = SerializerDeserializerV3.serialize(expected);
+        final Maze result = SerializerDeserializerV3.deserialize(bytes);
+        assertThat(result).isEqualTo(expected);
+    }
+
+    @Test
+    void testSerializeDeserializeMedium() throws IOException {
+        final Maze expected = new Maze(20, 20, -271828182846L);
+        new Wilson(expected).run();
+        final byte[] bytes = SerializerDeserializerV3.serialize(expected);
+        final Maze result = SerializerDeserializerV3.deserialize(bytes);
+        assertThat(result).isEqualTo(expected);
+    }
+
+    @Test
+    void testSerializeDeserializeLarge() throws IOException {
+        final Maze expected = new Maze(200, 320, 3141592653589793238L);
+        new Wilson(expected).run();
+        final byte[] bytes = SerializerDeserializerV3.serialize(expected);
+        final Maze result = SerializerDeserializerV3.deserialize(bytes);
+        assertThat(result).isEqualTo(expected);
+    }
+}