diff --git a/ClientAndLoggers/ClientMain.class b/ClientAndLoggers/ClientMain.class
index 3c43107e0f47157f8c5d846fd50489c8ba1eb6a4..917b8b2fb573e063c4c48874232175fd7f090f8c 100644
Binary files a/ClientAndLoggers/ClientMain.class and b/ClientAndLoggers/ClientMain.class differ
diff --git a/ClientAndLoggers/ClientMain.java b/ClientAndLoggers/ClientMain.java
index 5b761bcd6b095e50e6848bdf4bcb4fa58be3b8cb..9e99b56079779c323d1f7e253befcf2304020f1a 100644
--- a/ClientAndLoggers/ClientMain.java
+++ b/ClientAndLoggers/ClientMain.java
@@ -13,7 +13,7 @@ public class ClientMain {
 			if (!downloadFolder.mkdir()) throw new RuntimeException("Cannot create download folder (folder absolute path: " + downloadFolder.getAbsolutePath() + ")");
 		
 		
-		testClient(cport, timeout, downloadFolder, uploadFolder);
+		testClient(cport, timeout, downloadFolder);
 		
 	}
 	
@@ -31,7 +31,7 @@ public class ClientMain {
 			
 			try { client.store(new File("test.txt")); } catch(IOException e) { e.printStackTrace(); }
 
-			try {Thread.sleep(10000);} catch (InterruptedException e) {System.out.println(e);}
+			try {Thread.sleep(5000);} catch (InterruptedException e) {System.out.println(e);}
 			
 //			try { client.store(new File("Clipboard01.pdf")); } catch(IOException e) { e.printStackTrace(); }
 //
@@ -40,14 +40,14 @@ public class ClientMain {
 //			String list[] = null;
 //			try { list = list(client); } catch(IOException e) { e.printStackTrace(); }
 //
-			try { client.load("test.txt", downloadFolder); } catch(IOException e) { e.printStackTrace(); }
+//			try { client.load("test.txt", 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(); }
+//			if (list != null)
+//				for (String filename : list)
+//					try { client.remove(filename); } catch(IOException e) { e.printStackTrace(); }
+			try { client.remove("test.txt"); } catch(IOException e) { e.printStackTrace(); }
 			
-			try { list(client); } catch(IOException e) { e.printStackTrace(); }*/
+//			try { list(client); } catch(IOException e) { e.printStackTrace(); }
 			
 		} finally {
 			if (client != null)
diff --git a/Dstores/dstore/test.txt b/Dstores/dstore/test.txt
deleted file mode 100644
index abd91bd4652ea1bfd4969a0a8585cc2f8acb645f..0000000000000000000000000000000000000000
--- a/Dstores/dstore/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-a test file
\ No newline at end of file
diff --git a/Dstores/dstore2/test.txt b/Dstores/dstore2/test.txt
deleted file mode 100644
index abd91bd4652ea1bfd4969a0a8585cc2f8acb645f..0000000000000000000000000000000000000000
--- a/Dstores/dstore2/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-a test file
\ No newline at end of file
diff --git a/Dstores/dstore3/test.txt b/Dstores/dstore3/test.txt
deleted file mode 100644
index abd91bd4652ea1bfd4969a0a8585cc2f8acb645f..0000000000000000000000000000000000000000
--- a/Dstores/dstore3/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-a test file
\ No newline at end of file
diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java
index ce797fce420443bb7fa8448fc2957d287a886fc0..30c4ecfc3c1472b6742efe43878c75487dc5f3cd 100644
--- a/src/ftp/Controller.java
+++ b/src/ftp/Controller.java
@@ -60,11 +60,13 @@ public class Controller extends Server {
         String command = args[0];
 
         if (command.equals("JOIN")) {
+            Socket dStoreSock = client;
+
             Integer port = Integer.parseInt(args[1]);
 
-            send("LIST", client);
+            send("LIST", dStoreSock);
 
-            String files = readSocket(client);
+            String files = readSocket(dStoreSock);
 
             DStoreConnection dStore;
 
@@ -89,7 +91,7 @@ public class Controller extends Server {
             nextID++;
 
 
-            send("ACK", client);
+            send("JOINED", dStoreSock);
         }
 
         else if (command.equals("STORE")) {
@@ -114,16 +116,15 @@ public class Controller extends Server {
                     collect(Collectors.joining(" "));
 
 
-            file.setStoreAcksQuota(r);
+            file.setAcksQuota(r);
 
             send("STORE_TO " + ports, client);
 
 
             Boolean fileStored = false;
             while (!fileStored) {
-                if (file.ackCheck()) {
+                if (file.storeAckCheck()) {
                     file.setStoreInProgress(false);
-                    file.setStoreComplete(true);
                     fileStored = true;
 
                     threadIDOutput("Store of file " + filename + " complete");
@@ -148,6 +149,67 @@ public class Controller extends Server {
 
             send("LOAD_FROM " + dStorePort + " " + file.getFilesize(), client);
         }
+
+        else if (command.equals("REMOVE")) {
+            String filename = args[1];
+            DStoreFile file = fileIndex.get(filename);
+
+            file.setRemoveInProgress(true);
+
+
+            DStoreIndex dStores = file.getDStores();
+
+            dStores.entrySet().stream().
+                    forEach(x -> {
+                        Socket dStore = connectToDStore(x.getValue());
+
+                        if (dStore != null) {
+                            send("REMOVE " + filename, dStore);
+                        } else threadIDErr("Unable to connect to DataStore");
+
+                        closeConnection("DataStore", dStore);
+                    });
+
+
+            Boolean fileRemoved = false;
+            while (!fileRemoved) {
+                if (file.removeAckCheck()) {
+                    file.setRemoveInProgress(false);
+                    fileRemoved = true;
+
+                    threadIDOutput("Remove of file " + filename + " complete");
+
+                    send("STORE_COMPLETE", client);
+                }
+            }
+        }
+
+        else if (command.equals("REMOVE_ACK")) {
+            String filename = args[1];
+            DStoreFile file = fileIndex.get(filename);
+
+            file.removeAck();
+        }
+    }
+
+
+
+    public Socket connectToDStore(DStoreConnection dStoreConnection) {
+        Socket dStore = null;
+
+        Boolean joined = false;
+
+        for (int i = 0; (i < 10) && !joined; i++) {
+            try { dStore = new Socket("localhost", dStoreConnection.getPort()); joined = true; }
+            catch (IOException e) {
+                threadIDErr(e.getMessage());
+
+                try {threadIDErr("Retrying Connection..."); Thread.sleep(1000);}
+                catch (InterruptedException exc) {threadIDErr(exc.getMessage());}
+            }
+        }
+
+        return dStore;
     }
 
 }
\ No newline at end of file
diff --git a/src/ftp/DStore.java b/src/ftp/DStore.java
index 8346c8d607433846a0829a35c59d4641f6db84f9..d252896dec2f5c453c4fdba11875cfb41b119728 100644
--- a/src/ftp/DStore.java
+++ b/src/ftp/DStore.java
@@ -84,6 +84,8 @@ public class DStore extends Server {
         String command = args[0];
 
         if (command.equals("LIST")) {
+            Socket controller = client;
+
             File folder = new File(file_folder);
 
             String fileMessage = "empty";
@@ -99,14 +101,14 @@ public class DStore extends Server {
             }
 
 
-            send(fileMessage, client);
+            send(fileMessage, controller);
 
 
-            String response = readSocket(client);
-            if (response.equals("ACK")) threadIDOutput("Successfully joined Controller");
+            String response = readSocket(controller);
+            if (response.equals("JOINED")) threadIDOutput("Successfully joined Controller");
 
 
-            closeConnection("Client", client);
+            closeConnection("Client", controller);
         }
 
         else if (command.equals("STORE")) {
@@ -135,13 +137,23 @@ public class DStore extends Server {
         else if (command.equals("LOAD_DATA")) {
             String filename = args[1];
 
-
             try {
                 sendFile(client, file_folder + "\\" + filename);
             } catch (IOException e) {
                 threadIDErr(e.getMessage());
             }
         }
+
+        else if (command.equals("REMOVE")) {
+            Socket controller = client;
+
+            String filename = args[1];
+
+            if (deleteFile(file_folder + "\\" + filename)) threadIDOutput("Deleted file " + filename);
+            else threadIDErr("Failed to delete file " + filename);
+
+            send("REMOVE_ACK", controller);
+        }
     }
 
 
@@ -193,4 +205,12 @@ public class DStore extends Server {
         //out.close();
     }
 
+
+
+    public Boolean deleteFile(String filepath) {
+        File file = new File(filepath);
+
+        return file.delete();
+    }
+
 }
diff --git a/src/ftp/DStoreFile.java b/src/ftp/DStoreFile.java
index ae22dcf4d5ef50da6db5d33d75bdb270013fa6f4..7539337c844990ece0b530626834a657aa1d2b54 100644
--- a/src/ftp/DStoreFile.java
+++ b/src/ftp/DStoreFile.java
@@ -6,13 +6,14 @@ public class DStoreFile {
     private Long filesize;
 
     private boolean storeInProgress;
-    private boolean storeComplete;
     private boolean removeInProgress;
-    private boolean removeComplete;
 
     private int storeAcksQuota;
     private int storeAcks = 0;
 
+    private int removeAcksQuota;
+    private int removeAcks = 0;
+
     private DStoreIndex dStoreIndex;
 
 
@@ -27,16 +28,12 @@ public class DStoreFile {
 
 
     public boolean isStoreInProgress() {return storeInProgress;}
-    public boolean isStoreComplete() {return storeComplete;}
     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; }
-    public void setRemoveComplete(Boolean complete) { removeComplete = complete; }
 
 
 
@@ -45,17 +42,25 @@ public class DStoreFile {
 
 
 
+    public void setAcksQuota(int quota) { storeAcksQuota = quota; removeAcksQuota = quota; }
+
     public void setStoreAcksQuota(int quota) { storeAcksQuota = quota; }
     public int getStoreAcks() { return storeAcks; }
 
 
 
+    public void setRemoveAcksQuota(int quota) { removeAcksQuota = quota; }
+    public int getStoreAcksQuota() { return storeAcksQuota; }
+
+
+
     public int storeAck() { return storeAcks++; }
+    public Boolean storeAckCheck() { return storeAcks == storeAcksQuota; }
 
 
 
-    public Boolean storeAckCheck() { return storeAcks++ == storeAcksQuota; }
-    public Boolean ackCheck() { return storeAcks == storeAcksQuota; }
+    public int removeAck() { return removeAcks++; }
+    public Boolean removeAckCheck() { return removeAcks == removeAcksQuota; }
 
 
 
@@ -67,4 +72,8 @@ public class DStoreFile {
         return dStoreIndex.getFirstAvailable();
     }
 
+
+
+    public DStoreIndex getDStores() { return dStoreIndex; }
+
 }