diff --git a/Controller.java b/Controller.java
index 1866ab294e69098f9a8cc738461e85305cca98c8..07d5edc07365edc40ecff6b45de2d0cf9cce9331 100644
--- a/Controller.java
+++ b/Controller.java
@@ -327,12 +327,13 @@ public class Controller {
 							}
 							catch(Exception e) {
 								//Log error
-								System.out.println("Error processing store ack from dstore " + thisStore);
+								System.err.println("Error processing store ack from dstore " + thisStore);
+								e.printStackTrace();
 							}
 						}
 						else {
 							//Log error
-							System.out.println("Dstore " + thisStore + " should have sent STORE_ACK but Controller received " + receivedMessage[0]);
+							System.err.println("Dstore " + thisStore + " should have sent STORE_ACK but Controller received " + receivedMessage[0]);
 						}
 					}
 					catch(DstoreDisconnectException e) {
@@ -437,15 +438,18 @@ public class Controller {
 	void remove(Socket client, String filename) throws Exception {
 		try {
 			IndexEntry entry;
+			System.out.println("About to remove " + filename);
 			try {
 				synchronized(index) {
 					entry = index.get(filename);
 					if(entry == null || entry.getStatus() != IndexEntry.Status.STORE_COMPLETE) {
+						System.out.println("Oops, " + filename + " does not exist!");
 						throw new InvalidStatusException();
 					}
 					
 					//Update index to "remove in progress"
 					entry.setStatus(IndexEntry.Status.REMOVE_IN_PROGRESS);
+					System.out.println("Remove status for " + filename + " set!");
 				}
 			}
 			catch(InvalidStatusException e) {
@@ -453,12 +457,19 @@ public class Controller {
 				clientOut.println(Protocol.ERROR_FILE_DOES_NOT_EXIST_TOKEN);
 				clientOut.flush();
 				messageSent(client, Protocol.ERROR_FILE_DOES_NOT_EXIST_TOKEN);
+				System.out.println("Informed client that " + filename + " does not exist");
 				return;
 			}
 			
 			//Send REMOVE message to all Dstores storing the file
-			CountDownLatch latch = new CountDownLatch(entry.getStoredBy().size());
-			Iterator<Integer> it = entry.getStoredBy().iterator();
+			List<Integer> storedBy;
+			CountDownLatch latch;
+			Iterator<Integer> it;
+			synchronized(entry.getStoredBy()) {
+				storedBy = new ArrayList<Integer>(entry.getStoredBy());
+			}
+			latch = new CountDownLatch(storedBy.size());
+			it = storedBy.iterator();
 			while(it.hasNext()) {
 				Integer dstore = it.next();
 				new Thread(() -> {
@@ -508,8 +519,17 @@ public class Controller {
 			System.out.println("Fetching list...");
 			//Send file list to client
 			String message = Protocol.LIST_TOKEN + " ";
-			for(String name : index.keySet()) {
-				if(index.get(name).getStatus() == IndexEntry.Status.STORE_COMPLETE) message = message + name + " ";
+			Iterator<String> it;
+			synchronized(index) {
+				it = index.keySet().iterator();
+				while(it.hasNext()) {
+					String name = it.next();
+					IndexEntry entry = index.get(name);
+					synchronized(entry) {
+						if(entry != null && entry.getStatus() == IndexEntry.Status.STORE_COMPLETE)
+							message = message + name + " ";
+					}
+				}
 			}
 			PrintWriter out = new PrintWriter(client.getOutputStream());
 			System.out.println("Sending...");
@@ -537,6 +557,7 @@ public class Controller {
 					catch(DstoreDisconnectException e) {
 						e.printStackTrace();
 						removeDstore(e);
+						listLatch.countDown();
 					}
 				});
 				thisThread.start();
diff --git a/DstoreConnection.java b/DstoreConnection.java
index 3ecc064be2243e61d26cad76531f6f03ca1299b0..c8550c114eae775b156ede2f6e1311f568108254 100644
--- a/DstoreConnection.java
+++ b/DstoreConnection.java
@@ -19,7 +19,6 @@ public class DstoreConnection {
 	protected boolean available;
 	protected List<String> queue;
 	protected int timeout;
-	protected DstoreDisconnectException disconnectException;
 	
 	public DstoreConnection(Socket socket, int port, int timeout) {
 		this.socket = socket;
@@ -30,7 +29,6 @@ public class DstoreConnection {
 			writer = new PrintWriter(socket.getOutputStream());
 			available = true;
 			queue = new ArrayList<String>();
-			disconnectException = new DstoreDisconnectException(this);
 		}
 		catch(IOException e) {
 			e.printStackTrace();
@@ -51,7 +49,7 @@ public class DstoreConnection {
 	}
 	
 	public DstoreDisconnectException getDisconnectData() {
-		return disconnectException;
+		return new DstoreDisconnectException(this);
 	}
 	
 	public String sendAndReceive(String message, String... expectedMessages) throws DstoreDisconnectException {
@@ -59,7 +57,7 @@ public class DstoreConnection {
 		synchronized(this) {
 			try {
 				System.out.println("Lock acquired");
-				if(!available) throw disconnectException;
+				if(!available) throw getDisconnectData();
 				writer.println(message);
 				writer.flush();
 				//System.out.println("Controller sent " + message + " to port " + port);
@@ -69,7 +67,7 @@ public class DstoreConnection {
 			catch(NullPointerException e) {
 				System.out.println("Dstore at port " + port + " disconnected");
 				available = false;
-				throw disconnectException;
+				throw getDisconnectData();
 			}
 		}
 	}
@@ -83,7 +81,7 @@ public class DstoreConnection {
 		System.out.println("Getting lock...");
 		synchronized(this) {
 			System.out.println("Lock acquired");
-			if(!available) throw disconnectException;
+			if(!available) throw getDisconnectData();
 			
 			//Check the queue twice: once incase the receiver is busy, twice incase the message was added by the last thread
 			findMessage = checkQueue(expectedMessages);
@@ -120,7 +118,7 @@ public class DstoreConnection {
 			ReceiveContext rc = new ReceiveContext(expectedMessages);
 			rc.start();
 			if(rc.latch.await(timeout, TimeUnit.MILLISECONDS)) {
-				if(rc.disconnected()) throw disconnectException;
+				if(rc.disconnected()) throw getDisconnectData();
 				else return rc.getReturnMessage();
 			}
 			else {
@@ -219,7 +217,10 @@ public class DstoreConnection {
 		}
 		
 		public void end() {
-			if(thread.isAlive()) thread.interrupt();
+			if(thread.isAlive()) {
+				thread.interrupt();
+				System.err.println("Controller read timed out");
+			}
 		}
 		
 		public boolean disconnected() {
diff --git a/error.txt b/error.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8c2cb7d80df914f0060e9feea655ab50075fea36
--- /dev/null
+++ b/error.txt
@@ -0,0 +1,168 @@
+FileAlreadyExistsException: Error trying to store file GameDotCom.jpg - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Grandad.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file SnowHalation.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file GameDotCom.jpg - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file SnowHalation.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file GameDotCom.jpg - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Grandad.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file spurk.jpg - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file spurk.jpg - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Grandad.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)
+FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists
+	at Client.a(SourceFile:277)
+	at Client.store(SourceFile:183)
+	at Client.store(SourceFile:156)
+	at ClientMain.test2Client(ClientMain.java:44)
+	at ClientMain$1.run(ClientMain.java:26)