diff --git a/src/ClientMain.java b/src/ClientMain.java
deleted file mode 100644
index 0d089151b00d3cd8f97822d3d11757906be2488f..0000000000000000000000000000000000000000
--- a/src/ClientMain.java
+++ /dev/null
@@ -1,123 +0,0 @@
-import java.io.File;
-import java.io.IOException;
-import java.util.Random;
-
-public class ClientMain {
-	
-	public static void main(String[] args) throws Exception {
-		
-		final int cport = Integer.parseInt(args[0]);
-		int timeout = Integer.parseInt(args[1]);
-			
-		File downloadFolder = new File("downloads");
-		if (!downloadFolder.exists())
-			if (!downloadFolder.mkdir()) throw new RuntimeException("Cannot create download folder (folder absolute path: " + downloadFolder.getAbsolutePath() + ")");
-		
-		File uploadFolder = new File("to_store");
-		if (!uploadFolder.exists())
-			throw new RuntimeException("to_store folder does not exist");
-		
-		// testClient(cport, timeout, downloadFolder);
-		
-		// example to launch a number of concurrent clients, each doing the same operations
-		for (int i = 0; i < 10; i++) {
-			new Thread() {
-				public void run() {
-					test2Client(cport, timeout, downloadFolder, uploadFolder);
-				}
-			}.start();
-		}
-	}
-	
-	public static void test2Client(int cport, int timeout, File downloadFolder, File uploadFolder) {
-		Client client = null;
-		
-		try {
-			client = new Client(cport, timeout, Logger.LoggingType.ON_FILE_AND_TERMINAL);
-			client.connect();
-			Random random = new Random(System.currentTimeMillis() * System.nanoTime());
-			
-			File fileList[] = uploadFolder.listFiles();
-			for (int i=0; i<fileList.length/2; i++) {
-				File fileToStore = fileList[random.nextInt(fileList.length)];
-				try {					
-					client.store(fileToStore);
-				} catch (Exception e) {
-					System.out.println("Error storing file " + fileToStore);
-					e.printStackTrace();
-				}
-			}
-			
-			String list[] = null;
-			try { list = list(client); } catch(IOException e) { e.printStackTrace(); }
-			
-			for (int i = 0; i < list.length/4; i++) {
-				String fileToRemove = list[random.nextInt(list.length)];
-				try {
-					client.remove(fileToRemove);
-				} catch (Exception e) {
-					System.out.println("Error remove file " + fileToRemove);
-					e.printStackTrace();
-				}
-			}
-			
-			try { list = list(client); } catch(IOException e) { e.printStackTrace(); }
-			
-		} catch(IOException e) {
-			e.printStackTrace();
-		} finally {
-			if (client != null)
-				try { client.disconnect(); } catch(Exception e) { e.printStackTrace(); }
-		}
-	}
-	
-	public static void testClient(int cport, int timeout, File downloadFolder) {
-		Client client = null;
-		
-		try {
-			
-			client = new Client(cport, timeout, Logger.LoggingType.ON_FILE_AND_TERMINAL);
-		
-			try { client.connect(); } catch(IOException e) { e.printStackTrace(); return; }
-			
-			try { list(client); } catch(IOException e) { e.printStackTrace(); }
-			
-			try { client.store(new File("Clipboard01.pdf")); } catch(IOException e) { e.printStackTrace(); }
-			
-			try { client.store(new File("Clipboard01.pdf")); } catch(IOException e) { e.printStackTrace(); }
-
-			try { client.store(new File("Clipboard01.jpg")); } catch(IOException e) { e.printStackTrace(); }
-			
-			String list[] = null;
-			try { list = list(client); } catch(IOException e) { e.printStackTrace(); }
-			
-			if (list != null)
-				for (String filename : list)
-					try { client.load(filename, downloadFolder); } catch(IOException e) { e.printStackTrace(); }
-			
-			/*if (list != null)
-				for (String filename : list)
-					try { client.remove(filename); } catch(IOException e) { e.printStackTrace(); }
-			try { client.remove(list[0]); } catch(IOException e) { e.printStackTrace(); }
-			
-			try { list(client); } catch(IOException e) { e.printStackTrace(); }*/
-			
-		} finally {
-			if (client != null)
-				try { client.disconnect(); } catch(Exception e) { e.printStackTrace(); }
-		}
-	}
-
-	public static String[] list(Client client) throws IOException, NotEnoughDstoresException {
-		System.out.println("Retrieving list of files...");
-		String list[] = client.list();
-		
-		System.out.println("Ok, " + list.length + " files:");
-		int i = 0; 
-		for (String filename : list)
-			System.out.println("[" + i++ + "] " + filename);
-		
-		return list;
-	}
-	
-}
diff --git a/src/Controller.java b/src/Controller.java
index e33510a4015ac4f7e5dcd2ce372c7000bc33648d..08ef4329c103d8e0ddef9f5d2cba007a8283aab3 100644
--- a/src/Controller.java
+++ b/src/Controller.java
@@ -10,6 +10,8 @@ public class Controller {
     // waits for Dstores to join the datastore (rebalance operation)
     // it doesn't serve any client request until at least R Dstores have joined the system
 
+    File file = new File("output.txt");
+
     public static void main (String[] args) {
 
         // port to listen on
@@ -35,13 +37,17 @@ public class Controller {
                         ports.add(client);
                         R = R - 1;
 
-                        BufferedReader in = new BufferedReader(
-                                new InputStreamReader(client.getInputStream()));
-                        String line;
-                        while((line = in.readLine()) != null)
-                            System.out.println(line + " received");
-                        client.close();
-
+                        Thread t = new Thread() {
+                            @Override
+                            public void run() {
+                                try {
+                                    handleDstores(client);
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                }
+                            }
+                        };
+                        t.start();
                     } else {
                         break;
                     }
@@ -54,7 +60,7 @@ public class Controller {
 
             /*
             #TODO
-            - use threads to connect multiple clients to a server
+            - use threads to connect multiple clients (Dstore and Client) to a server
              */
 
         } catch (IOException e) {
@@ -62,4 +68,58 @@ public class Controller {
         }
 
     }
+
+    private static void handleDstores(Socket clientSocket) throws IOException, InterruptedException {
+        OutputStream outputStream = clientSocket.getOutputStream();
+        InputStream inputStream = clientSocket.getInputStream();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+        String line;
+        while((line = reader.readLine()) != null) {
+            String[] tokens = line.split(" ");
+            String cmd = tokens[0];
+            if(cmd.equals("ACK")) {
+
+            } else if (cmd.equals("STORE_ACK")) {
+
+            } else if (cmd.equals("REMOVE_ACK")) {
+
+            } else if (cmd.equals("QUIT")) {
+                clientSocket.close();
+                break;
+            } else {
+                String msg = "unknown command " + line + "\n";
+                outputStream.write(msg.getBytes());
+            }
+
+            String msg = "You typed " + line + "\n";
+            outputStream.write(msg.getBytes());
+        }
+
+        if(!clientSocket.isClosed()) {
+            clientSocket.close();
+        }
+    }
+
+    private void createLogFile() {
+        try {
+            if(file.createNewFile()) {
+                System.out.println("File created");
+            } else {
+                System.out.println("File already exists");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void log(String message) {
+        try {
+            FileWriter writer = new FileWriter(file);
+            writer.write(message + " at " + System.currentTimeMillis() + "\n");
+            writer.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
 }
\ No newline at end of file