diff --git a/ClientAndLoggers/ClientMain.class b/ClientAndLoggers/ClientMain.class
index a51da4fd2f5f2b375bfa6a9dd450c8d797f44c1b..3c43107e0f47157f8c5d846fd50489c8ba1eb6a4 100644
Binary files a/ClientAndLoggers/ClientMain.class and b/ClientAndLoggers/ClientMain.class differ
diff --git a/ClientAndLoggers/ClientMain.java b/ClientAndLoggers/ClientMain.java
index 3f79c95b65126fc49f0afc6934ddc11c9810c55b..849530bf49a8a7dd71928edffd9065f7bf2c1f87 100644
--- a/ClientAndLoggers/ClientMain.java
+++ b/ClientAndLoggers/ClientMain.java
@@ -11,6 +11,10 @@ public class ClientMain {
 		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);
@@ -30,6 +34,8 @@ public class ClientMain {
 //			try { list(client); } catch(IOException e) { e.printStackTrace(); }
 			
 			try { client.store(new File("test.txt")); } catch(IOException e) { e.printStackTrace(); }
+
+			try {Thread.sleep(10000);} catch (InterruptedException e) {System.out.println(e);}
 			
 //			try { client.store(new File("Clipboard01.pdf")); } catch(IOException e) { e.printStackTrace(); }
 //
@@ -38,9 +44,7 @@ public class ClientMain {
 //			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(); }
+			try { client.load("test.txt", downloadFolder); } catch(IOException e) { e.printStackTrace(); }
 			
 			/*if (list != null)
 				for (String filename : list)
diff --git a/Dstores/dstore/test2.txt b/Dstores/dstore/test2.txt
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Dstores/dstore2/test2.txt b/Dstores/dstore2/test2.txt
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Dstores/dstore2/test3.txt b/Dstores/dstore2/test3.txt
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Dstores/dstore3/test2.txt b/Dstores/dstore3/test2.txt
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Dstores/dstore3/test3.txt b/Dstores/dstore3/test3.txt
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Dstores/dstore3/test4.txt b/Dstores/dstore3/test4.txt
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java
index 45b985e57e50b269b28a5ddc783af16ad8ae6de3..0316c1dceb5c81914ce0003dc8c38c650676aa9f 100644
--- a/src/ftp/Controller.java
+++ b/src/ftp/Controller.java
@@ -1,10 +1,7 @@
 package ftp;
 
 import java.io.IOException;
-import java.net.InetSocketAddress;
 import java.net.Socket;
-import java.nio.ByteBuffer;
-import java.nio.channels.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -15,7 +12,7 @@ public class Controller extends Server {
     private int rbPeriod;
     private int nextID = 0;
 
-    private DstoreIndex dstoreIndex;
+    private DStoreIndex dStoreIndex;
     private FileIndex fileIndex;
 
 
@@ -32,7 +29,7 @@ public class Controller extends Server {
         this.timeout = timeout;
         this.rbPeriod = rbPeriod;
 
-        dstoreIndex = new DstoreIndex();
+        dStoreIndex = new DStoreIndex();
         fileIndex = new FileIndex();
 
         start();
@@ -69,15 +66,26 @@ public class Controller extends Server {
 
             String files = readSocket(client);
 
-            // todo use stream instead
-            //
-            List<String[]> filesInfo = new ArrayList<String[]>() {{
-                String[] filesAndSizes = files.split("\\|");
-                for (String file : filesAndSizes) add(file.split(" "));
-            }};
+            DStoreConnection dStore;
+
+
+            if (!files.equals("empty")) {
+                List<DStoreFile> dStoreFiles = Arrays.stream(files.split("\\|")).
+                        map(x -> x.split(" ")).
+                        map(x -> new DStoreFile(x[0], Long.parseLong(x[1]))).
+                        collect(Collectors.toList());
+
+
+                dStore = new DStoreConnection(dStoreFiles, port, nextID);
+                dStoreFiles.stream().forEach(x -> x.addDstore(dStore));
+            }
+            else dStore = new DStoreConnection(port, nextID);
+
+
+            dStoreIndex.addDStore(dStore);
 
-            dstoreIndex.addDstore(filesInfo, port, nextID);
             threadIDOutput("New Dstore (ID: " + nextID + ") successfully joined");
+
             nextID++;
 
 
@@ -88,16 +96,20 @@ public class Controller extends Server {
             String filename = args[1];
             Long filesize = Long.parseLong(args[2]);
 
-            DstoreFile file = fileIndex.addFile(filename, filesize);
+            DStoreFile file = fileIndex.addFile(filename, filesize);
 
             file.setStoreInProgress(true);
 
 
-            List<DstoreConnection> dstores = dstoreIndex.getFirstN(r);
+            List<DStoreConnection> dStores = dStoreIndex.getFirstN(r);
 
-            dstores.stream().forEach(x -> x.addFile(file));
+            dStores.stream().
+                    forEach(x -> {
+                        x.addFile(file);
+                        file.addDstore(x);
+                    });
 
-            String ports = dstores.stream().
+            String ports = dStores.stream().
                     map(x -> Integer.toString(x.getPort())).
                     collect(Collectors.joining(" "));
 
@@ -109,7 +121,7 @@ public class Controller extends Server {
 
         else if (command.equals("STORE_ACK")) {
             String filename = args[1];
-            DstoreFile file = fileIndex.get(filename);
+            DStoreFile file = fileIndex.get(filename);
 
             file.storeAck();
 
@@ -120,6 +132,15 @@ public class Controller extends Server {
                 threadIDOutput("Store of file " + filename + " complete");
             }
         }
+
+        else if (command.equals("LOAD")) {
+            String filename = args[1];
+
+            DStoreFile file = fileIndex.get(filename);
+            int dStorePort = file.getDstore().getPort();
+
+            send("LOAD_FROM " + dStorePort + " " + file.getFilesize(), client);
+        }
     }
 
 }
\ No newline at end of file
diff --git a/src/ftp/Dstore.java b/src/ftp/DStore.java
similarity index 72%
rename from src/ftp/Dstore.java
rename to src/ftp/DStore.java
index 63af0af77baaa006491d562d5b65159acd3576db..c684ff1550ff5ed6b86223f0a661403debcb139d 100644
--- a/src/ftp/Dstore.java
+++ b/src/ftp/DStore.java
@@ -1,22 +1,14 @@
 package ftp;
 
-import ftp.DstoreConnection;
-import ftp.Server;
-
 import java.io.*;
-import java.net.InetSocketAddress;
 import java.net.Socket;
-import java.net.SocketException;
-import java.nio.ByteBuffer;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.SocketChannel;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-public class Dstore extends Server {
+public class DStore extends Server {
 
     int cport;
     String file_folder;
@@ -29,7 +21,7 @@ public class Dstore extends Server {
      * @param timeout timeout (ms)
      * @param file_folder where to store data locally
      */
-    public Dstore(int port, int cport, int timeout, String file_folder) {
+    public DStore(int port, int cport, int timeout, String file_folder) {
 
         this.port = port;
         this.cport = cport;
@@ -79,7 +71,7 @@ public class Dstore extends Server {
                 .collect(Collectors.toList());
 
 
-        Dstore dstore = new Dstore(intArgs.get(0), intArgs.get(1), intArgs.get(2), args[3]);
+        DStore dStore = new DStore(intArgs.get(0), intArgs.get(1), intArgs.get(2), args[3]);
     }
 
 
@@ -94,20 +86,17 @@ public class Dstore extends Server {
         if (command.equals("LIST")) {
             File folder = new File(file_folder);
 
+            String fileMessage = "empty";
+
 
-            //todo use stream instead
-            //
-            List<String> files = new ArrayList<String>() {{
-                for (File file : folder.listFiles()) add(file.getName() + " " + file.length());
-            }};
+            if (folder.listFiles().length > 0) {
+                List<String> files = Arrays.stream(folder.listFiles()).
+                        map(x -> x.getName() + " " + x.length()).
+                        collect(Collectors.toList());
 
-            // todo use joining instead of reduce
-            //
-            String ident = files.get(0);
-            files.remove(0);
 
-            String fileMessage = files.stream()
-                    .reduce(ident, (file1, file2) -> (file1 + "|" + file2));
+                fileMessage = files.stream().collect(Collectors.joining("|"));
+            }
 
 
             send(fileMessage, client);
@@ -137,6 +126,17 @@ public class Dstore extends Server {
                     send("STORE_ACK " + filename, controller);
                 } else threadIDErr("Unable to connect to Controller");
             }
+
+        else if (command.equals("LOAD_DATA")) {
+            String filename = args[1];
+
+
+            try {
+                sendFile(client, file_folder + "\\" + filename);
+            } catch (IOException e) {
+                threadIDErr(e.getMessage());
+            }
+        }
     }
 
 
@@ -163,4 +163,23 @@ public class Dstore extends Server {
 
     }
 
+
+
+    public void sendFile(Socket client, String filepath) throws IOException {
+        File inputFile = new File(filepath);
+        FileInputStream inf = new FileInputStream(inputFile);
+
+        OutputStream out = client.getOutputStream();
+
+        byte[] buf = new byte[1000]; int buflen;
+
+
+        while ((buflen = inf.read(buf)) != -1) {
+            out.write(buf, 0, buflen);
+        }
+
+
+        inf.close(); client.close(); out.close();
+    }
+
 }
diff --git a/src/ftp/DStoreConnection.java b/src/ftp/DStoreConnection.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c0aa08235916efad32540f55def1679a49bfd4d
--- /dev/null
+++ b/src/ftp/DStoreConnection.java
@@ -0,0 +1,53 @@
+package ftp;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class DStoreConnection {
+
+    private FileIndex file_index;
+    private int port;
+    private int id;
+
+
+
+//    public DStoreConnection(List<String[]> files, int port, int id) {
+//        this.port = port;
+//        this.id = id;
+//
+//        List<DStoreFile> dStoreFiles = files.stream()
+//                .map(x -> new DStoreFile(x[0],Long.parseLong(x[1])))
+//                .collect(Collectors.toList());
+//
+//        file_index = new FileIndex(dStoreFiles);
+//    }
+
+    public DStoreConnection(int port, int id) {
+        this.port = port;
+        this.id = id;
+
+        file_index = new FileIndex();
+    }
+
+    public DStoreConnection(List<DStoreFile> dStoreFiles, int port, int id) {
+        this.port = port;
+        this.id = id;
+
+        file_index = new FileIndex(dStoreFiles);
+    }
+
+
+
+    public void addFile(String filename, Long filesize) { DStoreFile file = file_index.addFile(filename,filesize); }
+
+    public void addFile(DStoreFile file) { file_index.put(file.getFilename(),file); }
+
+
+
+    public int getPort() { return port; }
+
+
+
+    public int getID() { return id; }
+
+}
diff --git a/src/ftp/DstoreFile.java b/src/ftp/DStoreFile.java
similarity index 79%
rename from src/ftp/DstoreFile.java
rename to src/ftp/DStoreFile.java
index 677a1f0aa6c5974f4e80fee6bd227972e0d626d1..ae22dcf4d5ef50da6db5d33d75bdb270013fa6f4 100644
--- a/src/ftp/DstoreFile.java
+++ b/src/ftp/DStoreFile.java
@@ -1,6 +1,6 @@
 package ftp;
 
-public class DstoreFile {
+public class DStoreFile {
 
     private String filename;
     private Long filesize;
@@ -13,15 +13,15 @@ public class DstoreFile {
     private int storeAcksQuota;
     private int storeAcks = 0;
 
-    private DstoreIndex dstoreIndex;
+    private DStoreIndex dStoreIndex;
 
 
 
-    public DstoreFile(String filename, Long filesize) {
+    public DStoreFile(String filename, Long filesize) {
         this.filename = filename;
         this.filesize = filesize;
 
-        dstoreIndex = new DstoreIndex();
+        dStoreIndex = new DStoreIndex();
     }
 
 
@@ -31,6 +31,8 @@ public class DstoreFile {
     public boolean isRemoveInProgress() {return removeInProgress;}
     public boolean isRemoveComplete() {return removeComplete;}
 
+
+
     public void setStoreInProgress(Boolean store) { storeInProgress = store; }
     public void setStoreComplete(Boolean complete) { storeComplete = complete; }
     public void setRemoveInProgress(Boolean remove) { removeInProgress = remove; }
@@ -45,13 +47,24 @@ public class DstoreFile {
 
     public void setStoreAcksQuota(int quota) { storeAcksQuota = quota; }
     public int getStoreAcks() { return storeAcks; }
+
+
+
     public int storeAck() { return storeAcks++; }
 
+
+
     public Boolean storeAckCheck() { return storeAcks++ == storeAcksQuota; }
     public Boolean ackCheck() { return storeAcks == storeAcksQuota; }
 
 
 
-    public void addDstore(DstoreConnection dstore) { dstoreIndex.put(dstore.getID(),dstore); }
+    public void addDstore(DStoreConnection dStore) { dStoreIndex.put(dStore.getID(),dStore); }
+
+
+
+    public DStoreConnection getDstore() {
+        return dStoreIndex.getFirstAvailable();
+    }
 
 }
diff --git a/src/ftp/DStoreIndex.java b/src/ftp/DStoreIndex.java
new file mode 100644
index 0000000000000000000000000000000000000000..5d4dcbd03c00971f2c6fcd5bc42311abc52db4ae
--- /dev/null
+++ b/src/ftp/DStoreIndex.java
@@ -0,0 +1,42 @@
+package ftp;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class DStoreIndex extends HashMap<Integer, DStoreConnection> {
+
+    public DStoreIndex() {}
+
+
+
+    public DStoreConnection addDStore(List<DStoreFile> files, int port, Integer id) {
+        DStoreConnection dStore = new DStoreConnection(files,port,id);
+        put(id, dStore);
+        return dStore;
+    }
+
+    public DStoreConnection addDStore(DStoreConnection dStore) {
+        put(dStore.getID(), dStore);
+        return dStore;
+    }
+
+
+
+    public List<DStoreConnection> getFirstN(int n) {
+        return entrySet().stream()
+                .map(x -> x.getValue())
+                .limit(n)
+                .collect(Collectors.toList());
+    }
+
+
+
+    public DStoreConnection getFirstAvailable() {
+        return entrySet().stream()
+                .map(x -> x.getValue())
+                .collect(Collectors.toList())
+        .get(0);
+    }
+
+}
diff --git a/src/ftp/DstoreConnection.java b/src/ftp/DstoreConnection.java
deleted file mode 100644
index b9ae67189e09de550057872399c07040294f8350..0000000000000000000000000000000000000000
--- a/src/ftp/DstoreConnection.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package ftp;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class DstoreConnection {
-
-    private FileIndex file_index;
-    private int port;
-    private int id;
-
-
-
-    public DstoreConnection(List<String[]> files, int port, int id) {
-        this.port = port;
-        this.id = id;
-
-        List<DstoreFile> dstoreFiles = files.stream()
-                .map(x -> new DstoreFile(x[0],Long.parseLong(x[1])))
-                .collect(Collectors.toList());
-
-        file_index = new FileIndex(dstoreFiles);
-    }
-
-
-
-    public void addFile(String filename, Long filesize) { DstoreFile file = file_index.addFile(filename,filesize); }
-
-    public void addFile(DstoreFile file) { file_index.put(file.getFilename(),file); }
-
-
-
-    public int getPort() { return port; }
-
-
-
-    public int getID() { return id; }
-
-}
diff --git a/src/ftp/DstoreIndex.java b/src/ftp/DstoreIndex.java
deleted file mode 100644
index 9a56ef153e9930b3fcfca4b1a2427af79a17b6bc..0000000000000000000000000000000000000000
--- a/src/ftp/DstoreIndex.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package ftp;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class DstoreIndex extends HashMap<Integer,DstoreConnection> {
-
-    public DstoreIndex() {}
-
-
-
-    public DstoreConnection addDstore(List<String[]> files, int port, Integer id) {
-        DstoreConnection dstore = new DstoreConnection(files,port,id);
-        put(id, dstore);
-        return dstore;
-    }
-
-
-
-    public List<DstoreConnection> getFirstN(int n) {
-        return entrySet().stream()
-                .map(x -> x.getValue())
-                .limit(n)
-                .collect(Collectors.toList());
-    }
-
-}
diff --git a/src/ftp/FileIndex.java b/src/ftp/FileIndex.java
index 4e248322800c0e646189c0f572ce3cd09cad59dc..dc38a14f33011893c430fe440121ebb10aeaaf22 100644
--- a/src/ftp/FileIndex.java
+++ b/src/ftp/FileIndex.java
@@ -3,18 +3,18 @@ package ftp;
 import java.util.HashMap;
 import java.util.List;
 
-public class FileIndex extends HashMap<String,DstoreFile> {
+public class FileIndex extends HashMap<String, DStoreFile> {
 
     public FileIndex() {}
 
-    public FileIndex(List<DstoreFile> list) {
+    public FileIndex(List<DStoreFile> list) {
         list.stream().forEach(x -> put(x.getFilename(),x));
     }
 
 
 
-    public DstoreFile addFile(String filename, Long filesize) {
-        DstoreFile file = new DstoreFile(filename,filesize);
+    public DStoreFile addFile(String filename, Long filesize) {
+        DStoreFile file = new DStoreFile(filename,filesize);
         put(filename,file);
         return file;
     }
diff --git a/src/ftp/Server.java b/src/ftp/Server.java
index 5a70e66f48152b2a5d5b1170d6a5516e9471731a..383dbb2a7767059f9d3d22042fb35785fd2f1eda 100644
--- a/src/ftp/Server.java
+++ b/src/ftp/Server.java
@@ -9,6 +9,7 @@ public abstract class Server {
     protected int timeout;
 
 
+
     protected void start() {
         try {
             ServerSocket ss = new ServerSocket(port);
@@ -40,9 +41,11 @@ public abstract class Server {
     }
 
 
+
     protected abstract void handleRequest(String request, Socket client);
 
 
+
     protected void send(String msg, Socket socket) {
         try {
             PrintWriter out = new PrintWriter(socket.getOutputStream());
@@ -55,7 +58,6 @@ public abstract class Server {
         }
     }
 
-
     protected void send(String msg, String hostname, int port) {
         try {
             Socket socket = new Socket(hostname, port);
@@ -70,6 +72,7 @@ public abstract class Server {
     }
 
 
+
     protected String readSocket(Socket socket) {
         String request = null;
 
@@ -86,6 +89,7 @@ public abstract class Server {
     }
 
 
+
     protected void threadIDOutput(String output) {
         System.out.println("Thread ID: " + Thread.currentThread().getId() + " " + output);
     }