diff --git a/src/main/java/lab/game/Background.java b/src/main/java/lab/game/Background.java
index 0f718ac5bd312ebc19e607a7bf30b4afe8a04112..606964f7b81e571963761f36f38f3b99daacc449 100644
--- a/src/main/java/lab/game/Background.java
+++ b/src/main/java/lab/game/Background.java
@@ -1,11 +1,16 @@
 package lab.game;
 
+import java.io.Serial;
+
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.image.Image;
 import javafx.scene.paint.Color;
 
 public class Background extends WorldEntity {
 
+	@Serial
+	private static final long serialVersionUID = 2566936061563448971L;
+	
 	private MyPoint[] imagePosition;
 	private static Image[] image;
 	private MyPoint speed;
diff --git a/src/main/java/lab/game/Boat.java b/src/main/java/lab/game/Boat.java
index bf84c337565ff7395059cd41bcf3c53c5631880c..34cd894fe348aa2c4c1f20613320e0fc2e2a681a 100644
--- a/src/main/java/lab/game/Boat.java
+++ b/src/main/java/lab/game/Boat.java
@@ -1,5 +1,6 @@
 package lab.game;
 
+import java.io.Serial;
 import java.util.Random;
 
 import javafx.geometry.Rectangle2D;
@@ -9,6 +10,9 @@ import lab.Setup;
 
 public class Boat extends WorldEntity implements Collisionable {
 
+	@Serial
+	private static final long serialVersionUID = -8233882073179438194L;
+	
 	private static final Random RANDOM = new Random();
 	private MyPoint speed;
 	private static Image image;
diff --git a/src/main/java/lab/game/LochNess.java b/src/main/java/lab/game/LochNess.java
index b1a50e7ef17514a171722c41a8a418833ca10e4e..da4aceb9ab7f4141850b0f6baed8d415c13108ca 100644
--- a/src/main/java/lab/game/LochNess.java
+++ b/src/main/java/lab/game/LochNess.java
@@ -1,5 +1,6 @@
 package lab.game;
 
+import java.io.Serial;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
@@ -7,6 +8,7 @@ import java.util.Random;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+
 import javafx.geometry.Rectangle2D;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.image.Image;
@@ -14,13 +16,16 @@ import lab.Setup;
 
 public class LochNess extends WorldEntity implements Collisionable {
 
+	@Serial
+	private static final long serialVersionUID = 5976652721811221254L;
+
 	private static Logger log = LogManager.getLogger(LochNess.class);
 
 	private static final Random RANDOM = new Random();
 
 	private MyPoint speed;
 	private static Image image;
-	private List<DeadListener> deadListeners = new ArrayList<>();
+	private transient List<DeadListener> deadListeners = new ArrayList<>();
 
 	public LochNess(Scene scene) {
 		super(scene, new MyPoint(0, 0), 90);
diff --git a/src/main/java/lab/game/MyDimension.java b/src/main/java/lab/game/MyDimension.java
index d5838b2ff907dd613a078058ee02a7495500b105..20cb459c8816555b7a83e5edc0765f62c651948a 100644
--- a/src/main/java/lab/game/MyDimension.java
+++ b/src/main/java/lab/game/MyDimension.java
@@ -1,11 +1,17 @@
 package lab.game;
 
+import java.io.Serial;
+import java.io.Serializable;
+
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 @AllArgsConstructor
 @Getter
-public class MyDimension {
+public class MyDimension implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = -4053578370437363200L;
 
 	private double width;
 
diff --git a/src/main/java/lab/game/MyPoint.java b/src/main/java/lab/game/MyPoint.java
index 721a676cc1f3c5d7a2fbd4612c011591480b9965..265ed63439f69a47bc520d87dfcc70b9784bff2e 100644
--- a/src/main/java/lab/game/MyPoint.java
+++ b/src/main/java/lab/game/MyPoint.java
@@ -1,6 +1,12 @@
 package lab.game;
 
-public class MyPoint {
+import java.io.Serial;
+import java.io.Serializable;
+
+public class MyPoint implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 5131948780897974323L;
 
 	public double x;
 	public double y;
diff --git a/src/main/java/lab/game/Rock.java b/src/main/java/lab/game/Rock.java
index 0337ce60538cf6b2c9e6ec9b6a084601ca742ff9..a3a2f4afd38b3c7d281fb7c8a1baa2623c685bb4 100644
--- a/src/main/java/lab/game/Rock.java
+++ b/src/main/java/lab/game/Rock.java
@@ -1,5 +1,6 @@
 package lab.game;
 
+import java.io.Serial;
 import java.util.Random;
 
 import javafx.scene.canvas.GraphicsContext;
@@ -10,6 +11,9 @@ import javafx.scene.transform.Transform;
 
 public class Rock  extends WorldEntity {
 
+	@Serial
+	private static final long serialVersionUID = -7708255870460093800L;
+	
 	private static final Random RANDOM = new Random();
 	private MyDimension size;
 	private double angle = 0;
diff --git a/src/main/java/lab/game/Scene.java b/src/main/java/lab/game/Scene.java
index e45ae1d39e4a5783bf13dc7c68e220d3d40653c9..c2bcc8f273419750b3a06c7edd90b13a9edd8a60 100644
--- a/src/main/java/lab/game/Scene.java
+++ b/src/main/java/lab/game/Scene.java
@@ -1,5 +1,12 @@
 package lab.game;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -55,11 +62,67 @@ public class Scene {
 	}
 
 	public void startServer() {
-		//TODO:
+		new Thread(() -> {
+			try (ServerSocket listenSocket = new ServerSocket(4600)) {
+				while (!Thread.currentThread().isInterrupted()) {
+					try {
+						Socket client = listenSocket.accept();
+						new Thread(() -> handleViewer(client), "Viewer handler").start();
+					} catch (IOException e) {
+						e.printStackTrace();
+					}
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+
+		}).start();
+	}
+
+	public void handleViewer(Socket client) {
+		try (OutputStream outputStream = client.getOutputStream();
+				ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
+			while (!Thread.currentThread().isInterrupted()) {
+				synchronized (entitiesLock) {
+					objectOutputStream.reset();
+					synchronized (entitiesLock) {
+						objectOutputStream.writeObject(sceneEntitites);
+					}
+					objectOutputStream.flush();
+				}
+				sleepForWhile();
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private void sleepForWhile() {
+		try {
+			Thread.sleep(20);
+		} catch (InterruptedException e) {
+			Thread.currentThread().interrupt();
+		}
 	}
 
 	public void connectToServer() {
-		//TODO:
+		new Thread(() -> {
+			try (Socket socketToServer = new Socket("localhost", 4600);
+					InputStream inputStream = socketToServer.getInputStream();
+					ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
+				while (!Thread.currentThread().isInterrupted()) {
+					Object o = objectInputStream.readObject();
+					if (o instanceof List l) {
+						synchronized (entitiesLock) {
+							sceneEntitites = l;
+						}
+					}
+				}
+			} catch (IOException | ClassNotFoundException e) {
+				e.printStackTrace();
+			}
+
+		}).start();
 	}
 
 	record LochNessDeadLog(LocalDateTime time, MyPoint position) {
diff --git a/src/main/java/lab/game/WorldEntity.java b/src/main/java/lab/game/WorldEntity.java
index 016fb5f3dbec0dc2ddc3e85ea0e257f69697f5d2..86225fce9ea06ca293cfa8bbe53d0ecd516d93de 100644
--- a/src/main/java/lab/game/WorldEntity.java
+++ b/src/main/java/lab/game/WorldEntity.java
@@ -1,10 +1,16 @@
 package lab.game;
 
+import java.io.Serial;
+import java.io.Serializable;
+
 import javafx.scene.canvas.GraphicsContext;
 
-public abstract class WorldEntity implements DrawableSimulable {
+public abstract class WorldEntity implements DrawableSimulable, Serializable {
 
-	protected Scene scene;
+	@Serial
+	private static final long serialVersionUID = 8500258821894708841L;
+	
+	protected transient Scene scene;
 	protected MyPoint position;
 	private int zIndex;