diff --git a/Controller.java b/Controller.java
index 958245e50e741693f5cf053cc3cf9b86967ed1ea..884df89840567d8cfab2045c265a8efd92dec499 100644
--- a/Controller.java
+++ b/Controller.java
@@ -20,54 +20,6 @@ public class Controller {
 	protected int timeout; //in milliseconds
 	protected int rebalancePeriod; //How long to wait to start the next rebalance operation, in milliseconds
 	
-	protected static class IndexEntry {
-		public static enum Status {
-			STORE_IN_PROGRESS,
-			STORE_COMPLETE,
-			REMOVE_IN_PROGRESS,
-			REMOVE_COMPLETE
-		}
-		
-		protected long filesize;
-		protected List<Integer> storedBy;
-		protected int numberToStore;
-		protected Status status;
-		
-		public IndexEntry() {
-			filesize = -1;
-			storedBy = Collections.synchronizedList(new ArrayList<Integer>());
-			status = Status.STORE_IN_PROGRESS;
-		}
-		
-		public synchronized void setFilesize(long filesize) {
-			this.filesize = filesize;
-		}
-		
-		public synchronized long getFilesize() {
-			return filesize;
-		}
-		
-		public synchronized void addStoredBy(int dstore) {
-			storedBy.add(Integer.valueOf(dstore));
-		}
-		
-		public synchronized void removeStoredBy(int dstore) {
-			storedBy.remove(Integer.valueOf(dstore));
-		}
-		
-		public List<Integer> getStoredBy() {
-			return storedBy;
-		}
-		
-		public synchronized void setStatus(Status status) {
-			this.status = status;
-		}
-		
-		public synchronized Status getStatus() {
-			return status;
-		}
-	}
-	
 	protected class Reloader extends ArrayList<Integer> {
 		public long filesize;
 	}
@@ -79,6 +31,7 @@ public class Controller {
 	protected Map<Socket,Reloader> loadRequests;
 	
 	protected RebalanceLock rebalanceLock;
+	protected StoreRemover remover;
 	
 	public Controller(int cport, int rFactor, int timeout, int rebalancePeriod) {
 		this.cport = cport;
@@ -89,6 +42,7 @@ public class Controller {
 		index = Collections.synchronizedMap(new HashMap<String,IndexEntry>());
 		loadRequests = Collections.synchronizedMap(new HashMap<Socket,Reloader>());
 		rebalanceLock = new RebalanceLock(rebalancePeriod);
+		remover = new StoreRemover(dstores, index);
 		
 		try {ControllerLogger.init(Logger.LoggingType.ON_FILE_AND_TERMINAL);} catch(IOException e) {e.printStackTrace();}
 	}
@@ -141,7 +95,7 @@ public class Controller {
 						if(message[0].equals(Protocol.JOIN_TOKEN)) {
 							int portNumber = Integer.parseInt(message[1]);
 							synchronized(rebalanceLock) {
-								dstores.put(portNumber, new DstoreConnection(client, portNumber, timeout));
+								dstores.put(portNumber, new DstoreConnection(client, portNumber, timeout, remover));
 								System.out.println("Dstore at " + portNumber + " joined");
 								ControllerLogger.getInstance().dstoreJoined(client, portNumber);
 								rebalanceLock.queueRebalance();
@@ -326,10 +280,6 @@ public class Controller {
 							System.err.println("Dstore " + thisStore + " timed out receiving STORE_ACK for " + filename);
 						}
 					}
-					catch(DstoreDisconnectException e) {
-						e.printStackTrace();
-						removeDstore(e);
-					}
 					catch(DeadStoreException e) {
 						System.err.println("Store for " + filename + " failed due to dead dstore");
 					}
@@ -472,10 +422,6 @@ public class Controller {
 							System.err.println("Dstore " + dstore + " timed out receiving REMOVE_ACK");
 						}
 					}
-					catch(DstoreDisconnectException e) {
-						e.printStackTrace();
-						removeDstore(e);
-					}
 					catch(DeadStoreException e) {
 						System.err.println("Remove for " + filename + " failed due to dead dstore");
 					}
@@ -553,11 +499,6 @@ public class Controller {
 							System.err.println("Dstore " + dstore + " timed out receiving file list");
 						}
 					}
-					catch(DstoreDisconnectException e) {
-						e.printStackTrace();
-						removeDstore(e);
-						listLatch.countDown();
-					}
 					catch(DeadStoreException e) {}
 				});
 				thisThread.start();
@@ -574,7 +515,7 @@ public class Controller {
 						Set<Integer> storesToRemove = new HashSet<Integer>(dstores.keySet());
 						storesToRemove.removeAll(dstoreFilesR.keySet());
 						for(Integer dstore : storesToRemove) {
-							removeDstore(dstores.get(dstore).getDisconnectData());
+							remover.removeDstore(dstore, dstores.get(dstore).getSocket());
 						}
 						dstoreFiles = new HashMap<Integer,List<String>>(dstoreFilesR);
 					}
@@ -602,10 +543,6 @@ public class Controller {
 						
 						latch.countDown();
 					}
-					catch(DstoreDisconnectException e) {
-						e.printStackTrace();
-						removeDstore(e);
-					}
 					catch(Exception e) {e.printStackTrace();}
 				}).start();
 			}
@@ -851,23 +788,6 @@ public class Controller {
 		return messages;
 	}
 	
-	void removeDstore(DstoreDisconnectException e) {
-		Integer port = e.getConnection().getPort();
-		synchronized(dstores) {
-			if(dstores.containsKey(port) && dstores.get(port).equals(e.getConnection())) dstores.remove(port);
-		}
-		
-		try {e.getConnection().getSocket().close();} catch(IOException ee) {}
-		
-		Iterator<IndexEntry> it;
-		synchronized(index) {it = index.values().iterator();}
-		while(it.hasNext()) {
-			it.next().removeStoredBy(port);
-		}
-		
-		rebalanceLock.queueRebalance();
-	}
-	
 	Iterator<Integer> sequenceIt = null;
 	Object sequenceLock = new Object();
 	Integer nextStoreInSequence() {
diff --git a/Dstore.java b/Dstore.java
index f0eb5765f23510c8f6326ddda2d0b3bb5c653102..d7a0a89b3e8aedd2729419a9702d5358dc6547d7 100644
--- a/Dstore.java
+++ b/Dstore.java
@@ -169,11 +169,11 @@ public class Dstore {
 				
 				//Send STORE_ACK message to the Controller
 				if(acknowledged) {
+					String controllerMessage = Protocol.STORE_ACK_TOKEN + " " + filename;
 					synchronized(controllerOut) {
-						String controllerMessage = Protocol.STORE_ACK_TOKEN + " " + filename;
 						controllerOut.println(controllerMessage);
-						messageSent(controllerSocket, controllerMessage);
 					}
+					messageSent(controllerSocket, controllerMessage);
 				}
 				
 				synchronized(fileSizes) {
diff --git a/DstoreConnection.java b/DstoreConnection.java
index d7cfa9445939ee24c320b4a53775cd5d61395bee..3b70d81560026f813e335c8f4f1b2f3646c904b2 100644
--- a/DstoreConnection.java
+++ b/DstoreConnection.java
@@ -19,19 +19,19 @@ public class DstoreConnection {
 	protected BufferedReader reader;
 	protected PrintWriter writer;
 	protected boolean available;
-	protected boolean disconnectThrown;
 	protected List<Message> queue;
 	protected int timeout;
+	protected StoreRemover remover;
 	
-	public DstoreConnection(Socket socket, int port, int timeout) {
+	public DstoreConnection(Socket socket, int port, int timeout, StoreRemover remover) {
 		this.socket = socket;
 		this.port = port;
 		this.timeout = timeout;
+		this.remover = remover;
 		try {
 			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 			writer = new PrintWriter(socket.getOutputStream(), true);
 			available = true;
-			disconnectThrown = false;
 			queue = new ArrayList<Message>();
 			new Thread(new Receiver()).start();
 		}
@@ -61,19 +61,9 @@ public class DstoreConnection {
 		return socket;
 	}
 	
-	public DstoreDisconnectException getDisconnectData() {
-		return new DstoreDisconnectException(this);
-	}
-	
-	public void checkAvailable() throws DeadStoreException, DstoreDisconnectException {
+	public void checkAvailable() throws DeadStoreException {
 		if(!available) {
-			if(!disconnectThrown) {
-				disconnectThrown = true;
-				throw getDisconnectData();
-			}
-			else {
-				throw new DeadStoreException(this);
-			}
+			throw new DeadStoreException(this);
 		}
 	}
 	
@@ -130,6 +120,7 @@ public class DstoreConnection {
 				if(message == null) {
 					//Disconnect
 					available = false;
+					remover.removeDstore(port, socket);
 				}
 				else {
 					enqueue(message);
@@ -138,7 +129,7 @@ public class DstoreConnection {
 		}
 	}
 	
-	public String sendAndReceive(String message, String... expectedMessages) throws DstoreDisconnectException, DeadStoreException {
+	public String sendAndReceive(String message, String... expectedMessages) throws DeadStoreException {
 		synchronized(writer) {
 			checkAvailable();
 			writer.println(message);
@@ -147,7 +138,7 @@ public class DstoreConnection {
 		return receive(expectedMessages);
 	}
 	
-	public String receive(String... expectedMessages) throws DstoreDisconnectException, DeadStoreException {
+	public String receive(String... expectedMessages) throws DeadStoreException {
 		class Timer implements Runnable {
 			public boolean terminated = false;
 			
@@ -160,194 +151,14 @@ public class DstoreConnection {
 			}
 		}
 		
+		checkAvailable();
 		String receivedMessage = null;
 		Timer timer = new Timer();
 		new Thread(timer).start();
 		while(receivedMessage == null && !timer.terminated) {
-			checkAvailable();
 			receivedMessage = checkQueue(expectedMessages);
-		}
-		return receivedMessage;
-	}
-	
-	/*
-	public String sendAndReceive(String message, String... expectedMessages) throws DstoreDisconnectException, DeadStoreException {
-		System.out.println("Getting lock...");
-		synchronized(this) {
-			try {
-				System.out.println("Lock acquired");
-				checkAvailable();
-				writer.println(message);
-				writer.flush();
-				//System.out.println("Controller sent " + message + " to port " + port);
-				ControllerLogger.getInstance().messageSent(socket, message);
-				return localReceive(expectedMessages);
-			}
-			catch(NullPointerException e) {
-				System.out.println("Dstore at port " + port + " disconnected");
-				available = false;
-				throw getDisconnectData();
-			}
-		}
-	}
-	
-	public String receive(String... expectedMessages) throws DstoreDisconnectException, DeadStoreException {
-		String findMessage = checkQueue(expectedMessages);
-		if(findMessage != null) {
-			return findMessage;
-		}
-		
-		System.out.println("Getting lock...");
-		synchronized(this) {
-			System.out.println("Lock acquired");
 			checkAvailable();
-			
-			//Check the queue twice: once incase the receiver is busy, twice incase the message was added by the last thread
-			findMessage = checkQueue(expectedMessages);
-			if(findMessage != null) {
-				return findMessage;
-			}
-			
-			return localReceive(expectedMessages);
-		}
-	}
-	
-	//Check the queue for the message before trying to receive any new messages (if no expected message is specified, return the head of the queue)
-	protected String checkQueue(String[] expectedMessages) {
-		if(expectedMessages.length == 0) return null;
-		
-		Iterator<String> it;
-		synchronized(queue) {
-			it = queue.iterator();
-		}
-		
-		while(it.hasNext()) {
-			String message = it.next();
-			if(isExpected(message, expectedMessages)) {
-				queue.remove(message);
-				return message;
-			}
-		}
-		
-		return null;
-	}
-	
-	protected String localReceive(String[] expectedMessages) throws DstoreDisconnectException {
-		ReceiveContext rc = null;
-		try {
-			rc = new ReceiveContext(expectedMessages);
-			rc.start();
-			if(rc.latch.await(timeout, TimeUnit.MILLISECONDS)) {
-				if(rc.disconnected()) throw getDisconnectData();
-				else return rc.getReturnMessage();
-			}
-			else {
-				rc.end();
-				return "";
-			}
-		}
-		catch(InterruptedException e) {
-			if(rc != null) rc.end();
-		}
-		
-		return "";
-	}
-	
-	protected boolean isExpected(String message, String[] expectedMessages) {
-		for(String s : expectedMessages) {
-			if(s.equals(message)) return true;
-		}
-		return false;
-	}
-	*/
-	
-	/*
-	//Seperate class for enabling timeouts while receiving messages
-	protected class ReceiveContext {
-		protected String[] expectedMessages;
-		protected String currentMessage;
-		protected String returnMessage;
-		protected Thread thread;
-		protected Body runnable;
-		protected boolean disconnected;
-		public CountDownLatch latch;
-		
-		public ReceiveContext(String[] expectedMessages) {
-			this.expectedMessages = expectedMessages;
-			currentMessage = null;
-			returnMessage = "";
-			disconnected = false;
-			latch = new CountDownLatch(1);
-		}
-		
-		public class Body implements Runnable {
-			public boolean active = true;
-				
-			public void run() {
-				try {
-					do {
-						while(!reader.ready() && active) {}
-						if(!active) return;
-						currentMessage = reader.readLine();
-						if(currentMessage == null) {
-							available = false;
-							disconnected = true;
-							break;
-						}
-						ControllerLogger.getInstance().messageReceived(socket, currentMessage);
-						if(expectedMessages.length > 0 && !isExpected(currentMessage, expectedMessages)) {
-							enqueue();
-						}
-					}
-					while(currentMessage == null && active);
-					//System.out.println("Controller received " + message + " from port " + port);
-					returnMessage = currentMessage;
-				}
-				catch(SocketException e) {
-					System.err.println("Trying to receive messages from " + port + " but socket is closed");
-					available = false;
-					disconnected = true;
-					returnMessage = "";
-				}
-				catch(IOException e) {
-					e.printStackTrace();
-					returnMessage = "";
-				}
-				finally {
-					latch.countDown();
-				}
-			}
-			
-			protected void enqueue() {
-				queue.add(currentMessage);
-				if(queue.size() > MAX_QUEUE_SIZE) queue.remove(0);
-				currentMessage = null;
-			}
-		}
-			
-		public String getReturnMessage() {
-			return returnMessage;
-		}
-		
-		public void start() {
-			runnable = new Body();
-			thread = new Thread(runnable);
-			thread.start();
-		}
-		
-		public void end() {
-			if(thread.isAlive()) {
-				thread.interrupt();
-				runnable.active = false;
-			}
-			if(currentMessage != null) {
-				queue.add(currentMessage);
-			}
-		}
-		
-		public boolean disconnected() {
-			return disconnected;
 		}
+		return receivedMessage;
 	}
-	*/
 }
diff --git a/DstoreDisconnectException.java b/DstoreDisconnectException.java
deleted file mode 100644
index 76e55f2c419e81cd2c2be3e53d74e88bd0a2d1f9..0000000000000000000000000000000000000000
--- a/DstoreDisconnectException.java
+++ /dev/null
@@ -1,18 +0,0 @@
-import java.lang.Throwable;
-import java.net.Socket;
-
-/*
-DstoreDisconnectException is thrown by the DstoreConnection class when a dstore's output stream is null
-*/
-public class DstoreDisconnectException extends Exception {
-	DstoreConnection connection;
-	
-	public DstoreDisconnectException(DstoreConnection connection) {
-		super("Dstore at port " + connection.getPort() + " has been disconnected");
-		this.connection = connection;
-	}
-	
-	public DstoreConnection getConnection() {
-		return connection;
-	}
-}
diff --git a/IndexEntry.java b/IndexEntry.java
new file mode 100644
index 0000000000000000000000000000000000000000..bbf507e7598dc137a0e5cf8e8cc22651c86339c3
--- /dev/null
+++ b/IndexEntry.java
@@ -0,0 +1,51 @@
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class IndexEntry {
+	public static enum Status {
+		STORE_IN_PROGRESS,
+		STORE_COMPLETE,
+		REMOVE_IN_PROGRESS,
+		REMOVE_COMPLETE
+	}
+	
+	protected long filesize;
+	protected List<Integer> storedBy;
+	protected int numberToStore;
+	protected Status status;
+	
+	public IndexEntry() {
+		filesize = -1;
+		storedBy = Collections.synchronizedList(new ArrayList<Integer>());
+		status = Status.STORE_IN_PROGRESS;
+	}
+	
+	public synchronized void setFilesize(long filesize) {
+		this.filesize = filesize;
+	}
+	
+	public synchronized long getFilesize() {
+		return filesize;
+	}
+	
+	public synchronized void addStoredBy(int dstore) {
+		storedBy.add(Integer.valueOf(dstore));
+	}
+	
+	public synchronized void removeStoredBy(int dstore) {
+		storedBy.remove(Integer.valueOf(dstore));
+	}
+	
+	public List<Integer> getStoredBy() {
+		return storedBy;
+	}
+	
+	public synchronized void setStatus(Status status) {
+		this.status = status;
+	}
+	
+	public synchronized Status getStatus() {
+		return status;
+	}
+}
diff --git a/StoreRemover.java b/StoreRemover.java
new file mode 100644
index 0000000000000000000000000000000000000000..b086567e2df1a18b1c0f021e54a910b105405914
--- /dev/null
+++ b/StoreRemover.java
@@ -0,0 +1,31 @@
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.net.Socket;
+import java.io.IOException;
+
+public class StoreRemover {
+	protected Map<Integer,DstoreConnection> dstores;
+	protected Map<String,IndexEntry> index;
+	
+	public StoreRemover(Map<Integer,DstoreConnection> dstores, Map<String,IndexEntry> index) {
+		this.dstores = dstores;
+		this.index = index;
+	}
+	
+	public void removeDstore(Integer port, Socket socket) {
+		synchronized(dstores) {
+			if(!dstores.containsKey(port) || dstores.get(port).getSocket() != socket) return;
+			dstores.remove(port);
+		}
+		
+		Iterator<IndexEntry> it;
+		synchronized(index) {it = index.values().iterator();}
+		while(it.hasNext()) {
+			it.next().removeStoredBy(port);
+		}
+		
+		try {socket.close();} catch(IOException ee) {}
+		System.err.println("DSTORE AT " + port + " HAS BEEN DISCONNECTED");
+	}
+}
diff --git a/error.txt b/error.txt
index b1a82ddf353a0ab8e6b88f9ef4bfacd3824ff52a..fb9ebf034354e4e707a028d0cfe7a7c476b419e6 100644
--- a/error.txt
+++ b/error.txt
@@ -1,201 +1,88 @@
-FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+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
+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 Look_Away.mp3 - file already exists
+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 Look_Away.mp3 - file already exists
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+FileAlreadyExistsException: Error trying to store file Look_Away.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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+Store for AllStar.txt failed due to dead dstore
+Store for PumpkinHill.txt failed due to dead dstore
+DSTORE AT 8081 HAS BEEN DISCONNECTED
+Store for Grandad.txt failed due to dead dstore
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-Not all STORE_ACKs have been received
 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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:239)
-	at Client.store(SourceFile:156)
-	at ClientMain.test2Client(ClientMain.java:44)
-	at ClientMain$1.run(ClientMain.java:26)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
@@ -205,99 +92,28 @@ FileAlreadyExistsException: Error trying to store file spurk.jpg - file already
 	at Client.store(SourceFile:156)
 	at ClientMain.test2Client(ClientMain.java:44)
 	at ClientMain$1.run(ClientMain.java:26)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+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)
-java.io.IOException: Connection closed by the Controller
-	at Client.list(SourceFile:121)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-9" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
+FileDoesNotExistException: Error trying to load or remove file SnowHalation.txt - file does not exist
+	at Client.remove(SourceFile:505)
+	at ClientMain.test2Client(ClientMain.java:57)
 	at ClientMain$1.run(ClientMain.java:26)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
-	at Client.store(SourceFile:156)
-	at ClientMain.test2Client(ClientMain.java:44)
+FileDoesNotExistException: Error trying to load or remove file SnowHalation.txt - file does not exist
+	at Client.remove(SourceFile:505)
+	at ClientMain.test2Client(ClientMain.java:57)
 	at ClientMain$1.run(ClientMain.java:26)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:239)
-	at Client.store(SourceFile:156)
-	at ClientMain.test2Client(ClientMain.java:44)
-	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8087 timed out receiving STORE_ACK for spurk.jpg
-Dstore 8089 timed out receiving STORE_ACK for spurk.jpg
-Dstore 8089 timed out receiving STORE_ACK for Grandad.txt
-Dstore 8094 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8088 timed out receiving STORE_ACK for spurk.jpg
-Dstore 8090 timed out receiving STORE_ACK for spurk.jpg
 Not all STORE_ACKs have been received
 Not all STORE_ACKs have been received
-Dstore 8085 timed out receiving STORE_ACK for Look_Away.mp3
-java.io.IOException: Connection closed by the Controller
-	at Client.list(SourceFile:121)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-3" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
 java.net.SocketTimeoutException: Read timed out
 	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
 	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
@@ -315,18 +131,7 @@ java.net.SocketTimeoutException: Read timed out
 	at Client.store(SourceFile:156)
 	at ClientMain.test2Client(ClientMain.java:44)
 	at ClientMain$1.run(ClientMain.java:26)
-java.io.IOException: Connection closed by the Controller
-	at Client.list(SourceFile:121)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-4" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8086 timed out receiving STORE_ACK for AllStar.txt
-Dstore 8083 timed out receiving STORE_ACK for AllStar.txt
-Dstore 8094 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8087 timed out receiving STORE_ACK for Grandad.txt
+Not all STORE_ACKs have been received
 java.net.SocketTimeoutException: Read timed out
 	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
 	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
@@ -340,27 +145,16 @@ java.net.SocketTimeoutException: Read timed out
 	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
 	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
 	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
+	at Client.store(SourceFile:239)
 	at Client.store(SourceFile:156)
 	at ClientMain.test2Client(ClientMain.java:44)
 	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8088 timed out receiving STORE_ACK for Grandad.txt
-Dstore 8087 timed out receiving STORE_ACK for AllStar.txt
-Not all STORE_ACKs have been received
-FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+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)
-java.io.IOException: Connection closed by the Controller
-	at Client.list(SourceFile:121)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-7" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
 java.net.SocketTimeoutException: Read timed out
 	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
 	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
@@ -378,201 +172,15 @@ java.net.SocketTimeoutException: Read timed out
 	at Client.store(SourceFile:156)
 	at ClientMain.test2Client(ClientMain.java:44)
 	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8085 timed out receiving STORE_ACK for AllStar.txt
-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
+FileAlreadyExistsException: Error trying to store file Look_Away.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)
-Dstore 8093 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8095 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8091 timed out receiving STORE_ACK for spurk.jpg
-Dstore 8084 timed out receiving STORE_ACK for Grandad.txt
-Dstore 8095 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8090 timed out receiving STORE_ACK for Grandad.txt
-Dstore 8093 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8086 timed out receiving STORE_ACK for spurk.jpg
-Dstore 8089 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8085 timed out receiving STORE_ACK for Grandad.txt
-Dstore 8081 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8091 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8087 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8092 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8090 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8092 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8091 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8088 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8092 timed out receiving STORE_ACK for spurk.jpg
-Dstore 8093 timed out receiving STORE_ACK for spurk.jpg
-FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists
+FileAlreadyExistsException: Error trying to store file Look_Away.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)
-Not all STORE_ACKs have been received
-Dstore 8085 timed out receiving STORE_ACK for SnowHalation.txt
-java.io.IOException: Unexpected message received (STORE_COMPLETE was expected): STORE_TO 8091 8092 8093 8094 8095 8081 8082 8083 8084 8085
-	at Client.store(SourceFile:254)
-	at Client.store(SourceFile:156)
-	at ClientMain.test2Client(ClientMain.java:44)
-	at ClientMain$1.run(ClientMain.java:26)
-Not all STORE_ACKs have been received
-Dstore 8083 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8086 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8084 timed out receiving STORE_ACK for SnowHalation.txt
-Dstore 8082 timed out receiving STORE_ACK for SnowHalation.txt
-java.io.IOException: Unexpected message received (STORE_COMPLETE was expected): STORE_TO 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095
-	at Client.store(SourceFile:254)
-	at Client.store(SourceFile:156)
-	at ClientMain.test2Client(ClientMain.java:44)
-	at ClientMain$1.run(ClientMain.java:26)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.store(SourceFile:177)
-	at Client.store(SourceFile:156)
-	at ClientMain.test2Client(ClientMain.java:44)
-	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8086 timed out receiving STORE_ACK for Grandad.txt
-java.io.IOException: Connection closed by the Controller
-	at Client.list(SourceFile:121)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-5" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
-java.io.IOException: Connection closed by the Controller
-	at Client.list(SourceFile:121)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-2" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8095 timed out receiving STORE_ACK for spurk.jpg
-Dstore 8094 timed out receiving STORE_ACK for spurk.jpg
-java.io.IOException: Connection closed by the Controller
-	at Client.list(SourceFile:121)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-6" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.list(SourceFile:93)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-0" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8091 timed out receiving STORE_ACK for PumpkinHill.txt
-java.net.SocketTimeoutException: Read timed out
-	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
-	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
-	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
-	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
-	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:982)
-	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
-	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
-	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
-	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
-	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
-	at Client.list(SourceFile:93)
-	at ClientMain.list(ClientMain.java:113)
-	at ClientMain.test2Client(ClientMain.java:52)
-	at ClientMain$1.run(ClientMain.java:26)
-Exception in thread "Thread-8" java.lang.NullPointerException
-	at ClientMain.test2Client(ClientMain.java:54)
-	at ClientMain$1.run(ClientMain.java:26)
-Dstore 8094 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8092 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8093 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8081 timed out receiving STORE_ACK for Unknown.txt
-Dstore 8082 timed out receiving STORE_ACK for Unknown.txt
-Dstore 8095 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8081 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8083 timed out receiving STORE_ACK for Unknown.txt
-Dstore 8082 timed out receiving STORE_ACK for Grandad.txt
-Dstore 8082 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8081 timed out receiving STORE_ACK for Grandad.txt
-Not all STORE_ACKs have been received
-Dstore 8085 timed out receiving STORE_ACK for Unknown.txt
-Dstore 8083 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8083 timed out receiving STORE_ACK for Grandad.txt
-Dstore 8084 timed out receiving STORE_ACK for Unknown.txt
-Not all STORE_ACKs have been received
-Not all STORE_ACKs have been received
-Dstore 8084 timed out receiving STORE_ACK for PumpkinHill.txt
-Dstore 8085 timed out receiving STORE_ACK for PumpkinHill.txt
-DstoreDisconnectException: Dstore at port 8081 has been disconnected
-	at DstoreConnection.getDisconnectData(DstoreConnection.java:65)
-	at DstoreConnection.checkAvailable(DstoreConnection.java:72)
-	at DstoreConnection.sendAndReceive(DstoreConnection.java:143)
-	at Controller.lambda$rebalance$3(Controller.java:548)
-	at java.base/java.lang.Thread.run(Thread.java:832)
-DstoreDisconnectException: Dstore at port 8082 has been disconnected
-	at DstoreConnection.getDisconnectData(DstoreConnection.java:65)
-	at DstoreConnection.checkAvailable(DstoreConnection.java:72)
-	at DstoreConnection.sendAndReceive(DstoreConnection.java:143)
-	at Controller.lambda$rebalance$3(Controller.java:548)
-	at java.base/java.lang.Thread.run(Thread.java:832)
-DstoreDisconnectException: Dstore at port 8085 has been disconnected
-	at DstoreConnection.getDisconnectData(DstoreConnection.java:65)
-	at DstoreConnection.checkAvailable(DstoreConnection.java:72)
-	at DstoreConnection.sendAndReceive(DstoreConnection.java:143)
-	at Controller.lambda$rebalance$3(Controller.java:548)
-	at java.base/java.lang.Thread.run(Thread.java:832)
-DstoreDisconnectException: Dstore at port 8084 has been disconnected
-	at DstoreConnection.getDisconnectData(DstoreConnection.java:65)
-	at DstoreConnection.checkAvailable(DstoreConnection.java:72)
-	at DstoreConnection.sendAndReceive(DstoreConnection.java:143)
-	at Controller.lambda$rebalance$3(Controller.java:548)
-	at java.base/java.lang.Thread.run(Thread.java:832)
-DstoreDisconnectException: Dstore at port 8083 has been disconnected
-	at DstoreConnection.getDisconnectData(DstoreConnection.java:65)
-	at DstoreConnection.checkAvailable(DstoreConnection.java:72)
-	at DstoreConnection.sendAndReceive(DstoreConnection.java:143)
-	at Controller.lambda$rebalance$3(Controller.java:548)
-	at java.base/java.lang.Thread.run(Thread.java:832)
-java.util.ConcurrentModificationException
-	at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1584)
-	at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1607)
-	at Controller.rebalance(Controller.java:544)
-	at Controller$RebalanceThread.runRebalance(Controller.java:210)
-	at Controller$RebalanceThread.run(Controller.java:198)
-	at java.base/java.lang.Thread.run(Thread.java:832)