diff --git a/Controller.java b/Controller.java
index 07d5edc07365edc40ecff6b45de2d0cf9cce9331..d3fe6ff825dd111110f0b9ae66d32ce7899f15d0 100644
--- a/Controller.java
+++ b/Controller.java
@@ -14,12 +14,6 @@ import java.util.HashSet;
 import java.util.Collection;
 import java.util.Collections;
 
-/*
-TO DO:
-Get rid of missing REMOVE_ACKs problem
-Distrbute files evenly (check spec for correct number of files on each store)
-*/
-
 public class Controller {
 	protected int cport; //Port to listen on
 	protected int rFactor; //Replication factor; each file is replicated across r Dstores
@@ -285,7 +279,7 @@ public class Controller {
 				synchronized(index) {
 					if(index.containsKey(filename)) {
 						entry = index.get(filename);
-						if(entry.getStatus() == IndexEntry.Status.REMOVE_IN_PROGRESS || entry.getStatus() == IndexEntry.Status.REMOVE_COMPLETE) {
+						if(entry.getStatus() == IndexEntry.Status.REMOVE_COMPLETE) {
 							index.remove(filename);
 						}
 						else {
@@ -362,7 +356,7 @@ public class Controller {
 				
 				//Remove file from index
 				synchronized(index) {
-					index.remove(filename);
+					if(index.containsKey(filename) && index.get(filename) == entry) index.remove(filename);
 				}
 			}
 		}
@@ -438,18 +432,15 @@ 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) {
@@ -457,7 +448,6 @@ 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;
 			}
 			
@@ -481,7 +471,7 @@ public class Controller {
 						}
 						else {
 							//Log error
-							System.out.println("Dstore " + dstore + " should have sent REMOVE_ACK but Controller received " + message[0]);
+							System.err.println("Dstore " + dstore + " should have sent REMOVE_ACK but Controller received " + message[0]);
 						}
 					}
 					catch(DstoreDisconnectException e) {
@@ -494,7 +484,7 @@ public class Controller {
 			//Wait for REMOVE_ACKs from all Dstores which were sent the REMOVE message
 			if(!latch.await(timeout, TimeUnit.MILLISECONDS)) {
 				//Log error
-				System.out.println("Not all REMOVE_ACKs have been received");
+				System.err.println("Not all REMOVE_ACKs have been received");
 			}
 			
 			//Update index to "remove complete"
@@ -582,6 +572,8 @@ public class Controller {
 			}
 			catch(Exception e) {e.printStackTrace();}
 			
+			if(dstoreFiles.isEmpty()) throw new Exception("All dstores have been disconnected!");
+			
 			Map<Integer,List<String>> newAlloc = allocate(dstoreFiles);
 			Map<Integer,String> sendIndex = composeRebalanceMessages(dstoreFiles, newAlloc);
 			CountDownLatch latch = new CountDownLatch(sendIndex.size());
@@ -623,6 +615,7 @@ public class Controller {
 				System.out.print(i);
 			}
 			System.out.print("\n");
+			resetSequence();
 		}
 	}
 	
@@ -646,16 +639,28 @@ public class Controller {
 	  //move files from dstores that have too many files
 	  //prioritize storing these files to dstores that don't have enough files
 	Map<Integer,List<String>> allocate(Map<Integer,List<String>> oldDstoreFiles) {
-		//Precaution made so that the input map is not modified
 		Map<Integer,List<String>> dstoreFiles = new HashMap<Integer,List<String>>();
+		List<String> availableFiles = new ArrayList<String>();
 		for(Integer i : oldDstoreFiles.keySet()) {
 			List<String> files = new ArrayList<String>();
 			for(String s : oldDstoreFiles.get(i)) {
 				if(index.containsKey(s)) files.add(s);
+				if(!availableFiles.contains(s)) availableFiles.add(s);
 			}
 			dstoreFiles.put(i, files);
 		}
 		
+		//These files have been lost to crashes and need to be removed from the index
+		synchronized(index) {
+			Iterator<String> it = index.keySet().iterator();
+			while(it.hasNext()) {
+				String file = it.next();
+				if(!availableFiles.contains(file)) {
+					it.remove();
+				}
+			}	
+		}
+		
 		class AllocComparator implements Comparator<Integer> {
 			protected int m;
 			public AllocComparator(boolean ascending) {
@@ -765,6 +770,17 @@ public class Controller {
 			}
 		}
 		
+		Map<String,Integer> hasRequire = new HashMap<String,Integer>();
+		for(String file : requireIndex.keySet()) {
+			int count = 0;
+			for(Integer dstore : oldAlloc.keySet()) {
+				if(oldAlloc.get(dstore).contains(file)) {
+					count ++;
+				}
+			}
+			hasRequire.put(file, count);
+		}
+		
 		Map<Integer,String> messages = new HashMap<Integer,String>();
 		for(Integer dstore : newAlloc.keySet()) {
 			String thisMessage = "";
@@ -779,11 +795,18 @@ public class Controller {
 				if(oldFiles.contains(file)) {
 					filesToSend ++;
 					List<Integer> thisRequire = requireIndex.get(file);
-					thisMessage = thisMessage + " " + file + " " + thisRequire.size();
-					for(Integer otherStore : thisRequire) {
-						thisMessage = thisMessage + " " + otherStore;
+					int distribution = (int) Math.ceil((double) thisRequire.size() / (double) hasRequire.get(file));
+					//thisMessage = thisMessage + " " + file + " " + thisRequire.size();
+					int numberSentTo = 0;
+					String sentTo = "";
+					while(numberSentTo < distribution && !thisRequire.isEmpty()) {
+						Integer otherStore = thisRequire.get(0);
+						sentTo = sentTo + " " + otherStore;
+						thisRequire.remove(0);
+						numberSentTo ++;
 					}
-					it.remove();
+					thisMessage = thisMessage + " " + file + " " + numberSentTo + sentTo;
+					if(thisRequire.isEmpty()) it.remove();
 				}
 			}
 			
@@ -810,8 +833,9 @@ public class Controller {
 	void removeDstore(DstoreDisconnectException e) {
 		Integer port = e.getConnection().getPort();
 		synchronized(dstores) {
-			if(dstores.get(port).equals(e.getConnection())) dstores.remove(port);
+			if(dstores.containsKey(port) && dstores.get(port).equals(e.getConnection())) dstores.remove(port);
 		}
+		
 		try {e.getConnection().getSocket().close();} catch(IOException ee) {}
 		
 		Iterator<IndexEntry> it;
@@ -819,6 +843,8 @@ public class Controller {
 		while(it.hasNext()) {
 			it.next().removeStoredBy(port);
 		}
+		
+		rebalanceLock.queueRebalance();
 	}
 	
 	Iterator<Integer> sequenceIt = null;
@@ -828,10 +854,7 @@ public class Controller {
 		while(store == null) {
 			synchronized(sequenceLock) {
 				if(sequenceIt == null || !sequenceIt.hasNext()) {
-					synchronized(dstores) {
-						if(dstores.isEmpty()) return null;
-						sequenceIt = dstores.keySet().iterator();
-					}
+					if(!resetSequence()) return null;
 				}
 				
 				store = sequenceIt.next();
@@ -841,6 +864,14 @@ public class Controller {
 		return store;
 	}
 	
+	boolean resetSequence() {
+		synchronized(sequenceLock) { synchronized(dstores) {
+			if(dstores.isEmpty()) return false;
+			sequenceIt = new HashSet<Integer>(dstores.keySet()).iterator();
+		}}
+		return true;
+	}
+	
 	void messageSent(Socket socket, String message) {
 		ControllerLogger.getInstance().messageSent(socket, message);
 	}
diff --git a/CrashTesting.sh b/CrashTesting.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0aa4753e0feb4fc5a81f0b44f49d2987950534c7
--- /dev/null
+++ b/CrashTesting.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+java -cp .:loggers Controller 8080 $1 $3 $4 &
+echo $!
+rsec=$(($4/1000))
+processes=()
+for((i=1; i<=$2; i++)) do
+	sleep 0.2
+	n=$((8080+$i))
+	echo $n
+	s="store$i"
+	java -cp .:loggers Dstore $n 8080 $3 $s &
+	processes+=($!)
+done
+sleep 2
+java -cp .:client-1.0.2.jar ClientMain 8080 $3
+sleep $rsec
+for((i=0; i<$(($2-$1)); i++)) do
+	kill ${processes[$i]}
+done
+sleep $rsec
+for((i=1; i<=$(($2-$1)); i++)) do
+	java -cp .:loggers Dstore $((8280+$i)) 8080 $3 "storeNEW$i" &
+	sleep 0.2
+done
diff --git a/CrashTesting2.sh b/CrashTesting2.sh
new file mode 100755
index 0000000000000000000000000000000000000000..73636056536b5ca62e9181b104de5a21771252a6
--- /dev/null
+++ b/CrashTesting2.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+java -cp .:loggers Controller 8080 $1 $3 $4 &
+echo $!
+rsec=$(($4/1000))
+processes=()
+for((i=1; i<=$2; i++)) do
+	sleep 0.2
+	n=$((8080+$i))
+	echo $n
+	s="store$i"
+	java -cp .:loggers Dstore $n 8080 $3 $s &
+	processes+=($!)
+done
+sleep 2
+java -cp .:client-1.0.2.jar ClientMain 8080 $3 &
+kill ${processes[0]}
diff --git a/RebalanceLock.java b/RebalanceLock.java
index c2ea2974b5fa1818862b60a0ffa4ac834d613826..effa59d838121bc0c330378e92421467fc72e02a 100644
--- a/RebalanceLock.java
+++ b/RebalanceLock.java
@@ -42,7 +42,7 @@ public class RebalanceLock {
 		highPriorityWait = false;
 	}
 	
-	public void queueRebalance() {
+	public synchronized void queueRebalance() {
 		synchronized(blockLock) {
 			periodBlock.countDown();
 		}
diff --git a/error.txt b/error.txt
index 8c2cb7d80df914f0060e9feea655ab50075fea36..308020f60fd0570185aeedeb219af9c2a8f03a3d 100644
--- a/error.txt
+++ b/error.txt
@@ -1,10 +1,10 @@
-FileAlreadyExistsException: Error trying to store file GameDotCom.jpg - file already exists
+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 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)
@@ -16,115 +16,225 @@ FileAlreadyExistsException: Error trying to store file Grandad.txt - file alread
 	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
+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
+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)
-FileAlreadyExistsException: Error trying to store file rap.mp3 - 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)
-FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists
+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 Unknown.txt - file already exists
+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 GameDotCom.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)
-FileAlreadyExistsException: Error trying to store file SnowHalation.txt - file already exists
+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 GameDotCom.jpg - file already exists
+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
+DstoreDisconnectException: Dstore at port 8081 has been disconnected
+	at DstoreConnection.getDisconnectData(DstoreConnection.java:52)
+	at DstoreConnection.localReceive(DstoreConnection.java:121)
+	at DstoreConnection.receive(DstoreConnection.java:92)
+	at Controller.lambda$store$1(Controller.java:317)
+	at java.base/java.lang.Thread.run(Thread.java:832)
+DstoreDisconnectException: Dstore at port 8081 has been disconnected
+	at DstoreConnection.getDisconnectData(DstoreConnection.java:52)
+	at DstoreConnection.receive(DstoreConnection.java:84)
+	at Controller.lambda$store$1(Controller.java:317)
+	at java.base/java.lang.Thread.run(Thread.java:832)
+DstoreDisconnectException: Dstore at port 8081 has been disconnected
+	at DstoreConnection.getDisconnectData(DstoreConnection.java:52)
+	at DstoreConnection.receive(DstoreConnection.java:84)
+	at Controller.lambda$store$1(Controller.java:317)
+	at java.base/java.lang.Thread.run(Thread.java:832)
+DstoreDisconnectException: Dstore at port 8081 has been disconnected
+	at DstoreConnection.getDisconnectData(DstoreConnection.java:52)
+	at DstoreConnection.receive(DstoreConnection.java:84)
+	at Controller.lambda$store$1(Controller.java:317)
+	at java.base/java.lang.Thread.run(Thread.java:832)
+DstoreDisconnectException: Dstore at port 8081 has been disconnected
+	at DstoreConnection.getDisconnectData(DstoreConnection.java:52)
+	at DstoreConnection.receive(DstoreConnection.java:84)
+	at Controller.lambda$store$1(Controller.java:317)
+	at java.base/java.lang.Thread.run(Thread.java:832)
+Not all STORE_ACKs have been received
+Not all STORE_ACKs have been received
+Not all STORE_ACKs have been received
+Not all STORE_ACKs have been received
+Not all STORE_ACKs have been received
+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)
-FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists
-	at Client.a(SourceFile:277)
-	at Client.store(SourceFile:183)
+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)
-FileAlreadyExistsException: Error trying to store file AllStar.txt - 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 rap.mp3 - file already exists
+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
+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 PumpkinHill.txt - file already exists
+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:239)
+	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 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)
-FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists
+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 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)
-FileAlreadyExistsException: Error trying to store file Grandad.txt - file already exists
+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)
+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 spurk.jpg - file already exists
+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)
+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)
@@ -136,7 +246,7 @@ FileAlreadyExistsException: Error trying to store file Unknown.txt - file alread
 	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 Unknown.txt - file already exists
 	at Client.a(SourceFile:277)
 	at Client.store(SourceFile:183)
 	at Client.store(SourceFile:156)
@@ -148,19 +258,27 @@ FileAlreadyExistsException: Error trying to store file Grandad.txt - file alread
 	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
+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 PumpkinHill.txt - file already exists
+FileDoesNotExistException: Error trying to load or remove file spurk.jpg - file does not exist
+	at Client.remove(SourceFile:505)
+	at ClientMain.test2Client(ClientMain.java:57)
+	at ClientMain$1.run(ClientMain.java:26)
+FileDoesNotExistException: Error trying to load or remove file Look_Away.mp3 - file does not exist
+	at Client.remove(SourceFile:505)
+	at ClientMain.test2Client(ClientMain.java:57)
+	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 Unknown.txt - file already exists
+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)
diff --git a/loggers/ControllerLogger.class b/loggers/ControllerLogger.class
new file mode 100644
index 0000000000000000000000000000000000000000..d1501ec440c94f5a395d546f4a803efe8e9d29ca
Binary files /dev/null and b/loggers/ControllerLogger.class differ
diff --git a/loggers/DstoreLogger.class b/loggers/DstoreLogger.class
new file mode 100644
index 0000000000000000000000000000000000000000..ac67d99e6bd1c551748d3b73a4e7891edbc42419
Binary files /dev/null and b/loggers/DstoreLogger.class differ
diff --git a/loggers/Logger$LoggingType.class b/loggers/Logger$LoggingType.class
new file mode 100644
index 0000000000000000000000000000000000000000..a62bda1d6229f4047dd872fda4e641c5170aa594
Binary files /dev/null and b/loggers/Logger$LoggingType.class differ
diff --git a/loggers/Logger.class b/loggers/Logger.class
new file mode 100644
index 0000000000000000000000000000000000000000..642bbf6cfdb1489289c40fc83829f40627162802
Binary files /dev/null and b/loggers/Logger.class differ