diff --git a/pom.xml b/pom.xml
index f637ab44f42b984b055e5e068740db81f5249d52..e642a6397bb047193190ffec7debee0745883946 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,5 +33,12 @@
 			<version>5.5.2</version>
 			<scope>test</scope>
 		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
+		<dependency>
+		    <groupId>org.jsoup</groupId>
+		    <artifactId>jsoup</artifactId>
+		    <version>1.17.1</version>
+		</dependency>
+
 	</dependencies>
 </project>
diff --git a/src/main/java/lab12/App.java b/src/main/java/lab12/App.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc9e7f6bb89a4f517dc7b02f64edf1564a932ca0
--- /dev/null
+++ b/src/main/java/lab12/App.java
@@ -0,0 +1,13 @@
+package lab12;
+
+public class App {
+
+	public static void main(String[] args) {
+		while(true) {
+			String val = System.in.toString();
+			System.out.println(val);
+		}
+
+	}
+
+}
diff --git a/src/main/java/lab12/ClientApp.java b/src/main/java/lab12/ClientApp.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a718511efd03b9d34588d35fd21331a9f08a8d4
--- /dev/null
+++ b/src/main/java/lab12/ClientApp.java
@@ -0,0 +1,31 @@
+package lab12;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.Socket;
+
+public class ClientApp {
+	public static void main(String[] args) {
+		try (Socket soc = new Socket(args[0],Integer.parseInt(args[1]));
+			PrintWriter pw = new PrintWriter(soc.getOutputStream());
+			BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));)
+		{
+			BufferedReader brc = new BufferedReader(new InputStreamReader(System.in));
+			String line;
+			do {
+				line = brc.readLine();
+				pw.println(line);
+				pw.flush();
+				String lineFromServer = br.readLine();
+				System.out.println(lineFromServer);
+
+			} while (!"quit".equals(line));
+			System.out.println(br.readLine());
+			
+		} catch (NumberFormatException | IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/src/main/java/lab12/ImgDownloader.java b/src/main/java/lab12/ImgDownloader.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb48e837da33042bcaaa8e716e83d86ae6233470
--- /dev/null
+++ b/src/main/java/lab12/ImgDownloader.java
@@ -0,0 +1,56 @@
+package lab12;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+public class ImgDownloader {
+
+	public static void main(String[] args) throws IOException {
+		Document doc =  Jsoup.connect(args[0]).get(); 
+		Elements elements = doc.select("img[src]");
+		for (Element el: elements) {
+			String imgUrl = el.attr("abs:src");
+			System.out.println(imgUrl);
+			new Thread(() -> downloadImg(imgUrl, args[1]));
+			
+		}
+
+	}
+
+	private static void downloadImg(String imgUrl, String pathDir) {
+		
+		URL url;
+		try {
+			url = new URL(imgUrl);
+			String fileName =url.getPath();
+			fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
+			URLConnection connection = url.openConnection();
+			
+			try (InputStream is = connection.getInputStream() ){
+				Path path = Paths.get(pathDir, fileName);
+				try (OutputStream os = new FileOutputStream(path.toFile())) {
+					byte[] buffer = new byte[2048];
+					int len;
+					while (-1 != (len = is.read(buffer))) {
+						os.write(buffer, 0, len);
+					}
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+	}
+
+}
diff --git a/src/main/java/lab12/ServerApp.java b/src/main/java/lab12/ServerApp.java
index 71acf9468c7e167310ac54cbed4d6245bdb41026..dbb53c80ba091c81e725f60441897f35972a9482 100644
--- a/src/main/java/lab12/ServerApp.java
+++ b/src/main/java/lab12/ServerApp.java
@@ -24,9 +24,10 @@ public class ServerApp {
 	protected void listen() {
 		System.out.println("Server started and ready to connection");
 		while (true) {
-			try(Socket socketFromClient = server.accept()) {
+			try {
+				Socket socketFromClient = server.accept();
 				System.out.println("Client connected: " + socketFromClient.getInetAddress());
-				new ServerComunicator(socketFromClient).handle();
+				new Thread(() -> new ServerComunicator(socketFromClient).handle()).start();
 			} catch (IOException e) {
 				e.printStackTrace();
 			}
diff --git a/src/main/java/lab12/ServerComunicator.java b/src/main/java/lab12/ServerComunicator.java
index 5369ecceff93cf4f416f0255a0bba2e85a591365..87f800572170475e4962e8370b0d5f9de0c9adf3 100644
--- a/src/main/java/lab12/ServerComunicator.java
+++ b/src/main/java/lab12/ServerComunicator.java
@@ -31,6 +31,7 @@ public class ServerComunicator {
 			writerToClentSocket.write("May the Java be with you.");
 			writerToClentSocket.newLine();
 			writerToClentSocket.flush();
+			this.socket.close();
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index d2fa239323165c5fb8c791a663d3f983cfcdd5ef..27fc2b6f83e5af29894b19223e3a41e1d44ae9cb 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,4 +1,5 @@
 module cz.jezek.lab12 {
     opens lab12 to javafx.fxml;
     exports lab12;
+    requires org.jsoup;
 }
\ No newline at end of file