diff --git a/src/ftp/ClientConnection.java b/src/ftp/ClientConnection.java
deleted file mode 100644
index ccf66feb2aa48040ac918f0348f56fff6bd105b9..0000000000000000000000000000000000000000
--- a/src/ftp/ClientConnection.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package ftp;
-
-public class ClientConnection extends Connection {
-}
diff --git a/src/ftp/Connection.java b/src/ftp/Connection.java
deleted file mode 100644
index a9933b00d478be2b4370bdf30552b8c71d7fd951..0000000000000000000000000000000000000000
--- a/src/ftp/Connection.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package ftp;
-
-public abstract class Connection {
-}
diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java
index 695a828f24e977dcc99e494d712a4ffc1dfbfd3d..2b690a2b8d02f83b57f9f6e811684370706667f5 100644
--- a/src/ftp/Controller.java
+++ b/src/ftp/Controller.java
@@ -2,6 +2,7 @@ package ftp;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.nio.ByteBuffer;
 import java.nio.channels.*;
 import java.util.*;
@@ -13,6 +14,8 @@ public class Controller extends Server {
     int r;
     int rbPeriod;
 
+    private ArrayList<DstoreConnection> index;
+
 
     /**
      * @desc constructs a controller
@@ -27,9 +30,7 @@ public class Controller extends Server {
         this.timeout = timeout;
         this.rbPeriod = rbPeriod;
 
-        allocateBufferBytes(256);
-
-        openSelector();
+        start();
     }
 
 
@@ -48,13 +49,21 @@ public class Controller extends Server {
 
 
     @Override
-    protected void handleRequest(String request, SelectionKey key) {
+    protected void handleRequest(String request) {
         String args[] = request.split(" ");
 
         switch(args[0]) {
             case "JOIN":
-                key.attach(new DstoreConnection(new Index(), Integer.parseInt(args[1])));
-                sendMessage("LIST",key);
+                new DstoreConnection(new Index(), Integer.parseInt(args[1]));
+
+                Socket dstoreSocket = null;
+                try { dstoreSocket = new Socket("localhost",Integer.parseInt(args[1])); }
+                catch (IOException e) { System.err.println("Error: " + e); };
+
+                send("LIST", dstoreSocket);
+
+                System.out.println(readSocket(dstoreSocket));
+
                 break;
         }
     }
diff --git a/src/ftp/Dstore.java b/src/ftp/Dstore.java
index 18735c1e675407e5f42afb2816e6185d755e467a..901a5335cd9ff1efa7087007281d1cd7a60c0741 100644
--- a/src/ftp/Dstore.java
+++ b/src/ftp/Dstore.java
@@ -7,6 +7,7 @@ import ftp.Server;
 import java.io.File;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.net.SocketException;
 import java.nio.ByteBuffer;
 import java.nio.channels.SelectionKey;
@@ -21,7 +22,7 @@ public class Dstore extends Server {
     int cport;
     String file_folder;
 
-    private static SocketChannel toController;
+    private Socket controller;
 
 
     /**
@@ -37,34 +38,14 @@ public class Dstore extends Server {
         this.timeout = timeout;
         this.file_folder = file_folder;
 
+        controller = new Socket("localhost",cport);
 
-        // opening connection to controller
-        // open(addr) acts as convenience method for open() and connect()
-        // in blocking mode, so will wait for response before progressing
-        //
-        try {
-            toController = SocketChannel.open(new InetSocketAddress(cport));
-            toController.configureBlocking(false);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-
-        allocateBufferBytes(256);
+        send("JOIN " + port, controller);
 
-        sendMessage("JOIN " + port, toController);
-
-        openSelector(new SocketChannel[] {toController});
+        start();
     }
 
 
-    /*
-    buffer.flip();              //resets pos to 0 to read from buffer and sets limit to what was put there
-    client.write(buffer);
-    buffer.clear();             //empties buffer and clears, ready for writing
-    */
-
-
     public static void main(String args[]) {
         String numberArgs[] = Arrays.copyOf(args, args.length-1);
         Stream<String> str = Arrays.stream(numberArgs);
@@ -91,17 +72,19 @@ public class Dstore extends Server {
 
 
     @Override
-    protected void handleRequest(String request, SelectionKey key) {
+    protected void handleRequest(String request) {
         String args[] = request.split(" ");
 
         switch(args[0]) {
             case "LIST":
                 File folder = new File("storage");
                 String[] files = folder.list();
+
                 String fileNames = Arrays.stream(files)
                         .reduce("", (file1, file2) -> file1 + " " + file2);
 
-                sendMessage(fileNames, key);
+                send(fileNames, controller);
+
                 break;
         }
     }
diff --git a/src/ftp/DstoreConnection.java b/src/ftp/DstoreConnection.java
index 3acf37c83fdd982581ed83a6f69e0c60db29bd49..fbc3f2ec70cd3a84a98050966919ddb29254d47d 100644
--- a/src/ftp/DstoreConnection.java
+++ b/src/ftp/DstoreConnection.java
@@ -1,6 +1,6 @@
 package ftp;
 
-public class DstoreConnection extends Connection {
+public class DstoreConnection {
 
     private Index file_index;
     private int port;
diff --git a/src/ftp/Server.java b/src/ftp/Server.java
index 2794745e0ca4bb2469a98506c05b210b9c13143c..8ea0c44c74b3801b8b09334e4815bd6322e19f1b 100644
--- a/src/ftp/Server.java
+++ b/src/ftp/Server.java
@@ -1,250 +1,84 @@
 package ftp;
 
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.nio.ByteBuffer;
-import java.nio.channels.*;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Set;
+import java.io.*;
+import java.net.*;
 
 public abstract class Server {
 
     protected int port;
     protected int timeout;
 
-    protected Selector selector;
-    private ByteBuffer buffer;
 
-
-    protected void allocateBufferBytes(int bytes) {
-        buffer = ByteBuffer.allocate(bytes);               //buffer to read/write
-    }
-
-
-    /**
-     * @desc abstract method which handles server requests based on implmentation
-     * @param request request to be handled
-     * @param key corresponding key
-     */
-    protected abstract void handleRequest(String request, SelectionKey key);
-
-
-    /**
-     * @desc starts the selector and begins the server loop
-     * @throws IOException
-     */
-    protected void openSelector() throws IOException {
-        selector = Selector.open();
-        ServerSocketChannel serverSocket = ServerSocketChannel.open();
-        serverSocket.bind(new InetSocketAddress(port));
-        serverSocket.configureBlocking(false);
-        serverSocket.register(selector, SelectionKey.OP_ACCEPT);
-
-        System.out.println("Selector Started");
-
-        while (true) {
-            selector.select();
-            Set<SelectionKey> selectedKeys = selector.selectedKeys();
-            Iterator<SelectionKey> iter = selectedKeys.iterator();
-            while (iter.hasNext()) {
-
-                SelectionKey key = iter.next();
-
-                if (key.isAcceptable()) {
-                    System.out.println("Server socket ready to accept connection");
-                    register(selector, serverSocket);
-                }
-
-                if (key.isConnectable()) {
-                    System.out.println("Channel is ready to connect to the server");
-                }
-
-                if (key.isReadable()) {
-                    System.out.println("Channel has data to be read");
-                    String request = takeRequest(key);
-                    handleRequest(request, key);
-                }
-
-                iter.remove();
-            }
-        }
-    }
-
-
-    /**
-     * @desc starts the selector and begins the server loop, registers given initial channels
-     * @param channels initial channels to be registered with the selector
-     * @throws IOException
-     */
-    protected void openSelector(SocketChannel[] channels) throws IOException{
-        selector = Selector.open();
-        ServerSocketChannel serverSocket = ServerSocketChannel.open();
-        serverSocket.bind(new InetSocketAddress(port));
-        serverSocket.configureBlocking(false);
-
-        serverSocket.register(selector, SelectionKey.OP_ACCEPT);
-        Iterator<SocketChannel> sockIt = Arrays.stream(channels).iterator();
-        while (sockIt.hasNext()) {
-            SocketChannel channel = sockIt.next();
-            channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
-        }
-
-        buffer = ByteBuffer.allocate(256);               //buffer to read/write
-
-        System.out.println("Selector Started");
-
-        while (true) {
-            selector.select();
-            Set<SelectionKey> selectedKeys = selector.selectedKeys();
-            Iterator<SelectionKey> iter = selectedKeys.iterator();
-            while (iter.hasNext()) {
-
-                SelectionKey key = iter.next();
-
-                if (key.isAcceptable()) {
-                    System.out.println("Server socket ready to accept connection");
-                    register(selector, serverSocket);
-                }
-
-                if (key.isConnectable()) {
-                    System.out.println("Channel is ready to connect to the server");
-                }
-
-                if (key.isReadable()) {
-                    System.out.println("Channel has data to be read");
-                    String request = takeRequest(key);
-                    handleRequest(request, key);
+    protected void start() {
+        try {
+            ServerSocket ss = new ServerSocket(port);
+            while (true) {
+                try {
+                    System.out.println("Waiting for Connection...");
+                    final Socket client = ss.accept();
+                    new Thread(new Runnable() {
+                        public void run() {
+                            try {
+                                System.out.println("Connection Accepted");
+                                String request = readSocket(client);
+                                System.out.println("Recieved: " + request);
+                                handleRequest(request);
+                                client.close();
+                            } catch (Exception e) {}
+                        }
+                    }).start();
+                } catch (Exception e) {
+                    System.out.println("error " + e);
                 }
-
-                iter.remove();
             }
+        } catch (Exception e) {
+            System.out.println("error " + e);
         }
     }
 
 
-    /**
-     * @desc registers a newly accepted channel with the selector
-     * @param selector selector to be registered with
-     * @param serverSocket server socket which accepts the connection
-     * @throws IOException
-     */
-    protected void register(Selector selector, ServerSocketChannel serverSocket) throws IOException {
-        SocketChannel client = serverSocket.accept();
-        System.out.println("Channel accepted");
-        client.configureBlocking(false);
-        client.register(selector, SelectionKey.OP_READ);
-    }
-
-
-    /**
-     * @desc reads request from buffer
-     * @param key key linking to the channel
-     * @return returns the request
-     * @throws IOException
-     */
-    protected String takeRequest(SelectionKey key) throws IOException {
-        SocketChannel client = (SocketChannel) key.channel();
-        client.read(buffer);
-        String request = new String(buffer.array()).trim();
-        System.out.println("Received: " + request);
-        return request;
-    }
+    protected abstract void handleRequest(String request);
 
 
-    /**
-     * @desc sends a message using a given key and waits for a response
-     * @param msg message to be sent
-     * @param key key of corresponding channel to send message through
-     * @param buffer buffer to r/w messages
-     * @return
-     */
-    protected String sendMessageResponse(String msg, SelectionKey key, ByteBuffer buffer) {
-        buffer = ByteBuffer.wrap(msg.getBytes());
-
-        SocketChannel channel = (SocketChannel) key.channel();
-
-        String response = null;
+    protected void send(String msg, Socket socket) {
         try {
-            channel.write(buffer);
-            buffer.clear();
-            System.out.println("Sent message: " + msg);
-
-            channel.read(buffer);
-            response = new String(buffer.array()).trim();
-        } catch (IOException e) {
-            e.printStackTrace();
+            PrintWriter out = new PrintWriter(socket.getOutputStream());
+            out.println(msg);
+            out.flush();
+            System.out.println("Sent: " + msg);
         }
-
-        return response;
-    }
-
-
-    /**
-     * @desc sends a message using a given channel and waits for a response
-     * @param msg message to be sent
-     * @param channel channel to send message through
-     * @param buffer buffer to r/w messages
-     * @return
-     */
-    protected String sendMessageResponse(String msg, SocketChannel channel, ByteBuffer buffer) {
-        buffer = ByteBuffer.wrap(msg.getBytes());
-
-        String response = null;
-        try {
-            channel.write(buffer);
-            buffer.clear();
-            System.out.println("Sent message: " + msg);
-
-            channel.read(buffer);
-            response = new String(buffer.array()).trim();
-        } catch (IOException e) {
-            e.printStackTrace();
+        catch (IOException e) {
+            System.err.println("Error: " + e);
         }
-
-        return response;
     }
 
 
-    /**
-     * @desc sends a message using a given key, does not wait for a response
-     * @param msg message to be sent
-     * @param key key of corresponding channel to send message through
-     * @return
-     */
-    protected void sendMessage(String msg, SelectionKey key) {
-        buffer = ByteBuffer.wrap(msg.getBytes());
-
-        SocketChannel channel = (SocketChannel) key.channel();
-
+    protected void send(String msg, String hostname, int port) {
         try {
-            channel.write(buffer);
-            buffer.clear();
-            System.out.println("Sent message: " + msg);
-        } catch (IOException e) {
-            e.printStackTrace();
+            Socket socket = new Socket(hostname, port);
+            PrintWriter out = new PrintWriter(socket.getOutputStream());
+            out.println(msg);
+            out.flush();
+            System.out.println("Sent: " + msg);
+        }
+        catch (IOException e) {
+            System.err.println("Error: " + e);
         }
     }
 
 
-    /**
-     * @desc sends a message using a given channel, does not wait for a response
-     * @param msg message to be sent
-     * @param channel channel to send message through
-     * @return
-     */
-    protected void sendMessage(String msg, SocketChannel channel) {
-        buffer = ByteBuffer.wrap(msg.getBytes());
+    protected String readSocket(Socket socket) {
+        String request = null;
 
         try {
-            channel.write(buffer);
-            buffer.clear();
-            System.out.println("Sent message: " + msg);
-        } catch (IOException e) {
-            e.printStackTrace();
+            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+            request = in.readLine();
+        }
+        catch (IOException e) {
+            System.err.println("Error: " + e);
         }
-    }
 
+        return request;
+    }
 
-}
+}
\ No newline at end of file
diff --git a/testingWithClient/Client.java b/testingWithClient/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..b32fb25f42df3677e7483fda83e27d856e8c44e1
--- /dev/null
+++ b/testingWithClient/Client.java
@@ -0,0 +1,81 @@
+package ftp;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class Client {
+
+    int cport;
+    int timeout;
+
+    private static SocketChannel client;
+    private static ByteBuffer buffer;
+    private static Client instance;
+
+
+    /**
+     * @desc constructs a client
+     * @param cport controller port to talk to
+     * @param timeout timeout (ms)
+     */
+    public Client(int cport, int timeout) {
+        this.cport = cport;
+        this.timeout = timeout;
+
+        try {
+            client = SocketChannel.open(new InetSocketAddress(cport));
+            buffer = ByteBuffer.allocate(256);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public String sendMessage(String msg) {
+        buffer = ByteBuffer.wrap(msg.getBytes());
+        String response = null;
+        try {
+            client.write(buffer);
+            buffer.clear();
+            client.read(buffer);
+            response = new String(buffer.array()).trim();
+            buffer.clear();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return response;
+
+    }
+
+
+    public static void main(String args[]) {
+        Stream<String> str = Arrays.stream(args);
+
+        List<Integer> intArgs = str.map(x -> {return Integer.parseInt(x);})
+                .collect(Collectors.toList());
+
+        instance = new Client(intArgs.get(0),intArgs.get(1));
+
+        Scanner scanner = new Scanner(System.in);
+        String command = "";
+
+        while (!command.equals("QUIT")) {
+
+            System.out.println("Enter Command:");
+            command = scanner.nextLine();
+
+            String response = instance.sendMessage(command);
+
+            System.out.println("Response: " + response);
+
+        }
+    }
+
+}
diff --git a/testingWithClient/ClientMain.java b/testingWithClient/ClientMain.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c530f6f02e669ef4808ad6565f7b16c21583718
--- /dev/null
+++ b/testingWithClient/ClientMain.java
@@ -0,0 +1,85 @@
+import java.io.File;
+import java.io.IOException;
+
+public class ClientMain {
+	
+	public static void main(String[] args) {
+		
+		int cport = -1;
+		int timeout = -1;
+		try {
+			// parse arguments
+			cport = Integer.parseInt(args[0]);
+			timeout = Integer.parseInt(args[1]);
+		} catch (NumberFormatException e) {
+			System.err.println("Error parsing arguments: " + e.getMessage());
+			System.err.println("Expected: java ClientMain cport timeout");
+			System.exit(-1);
+		}
+			
+		File downloadFolder = new File("downloads");
+		if (!downloadFolder.exists())
+			if (!downloadFolder.mkdir()) throw new RuntimeException("Cannot create download folder (folder absolute path: " + downloadFolder.getAbsolutePath() + ")");
+		
+		testClient(cport, timeout, downloadFolder);
+		
+		// example to launch a number of concurrent clients, each doing the same operations
+		/*for (int i = 0; i < 10; i++) {
+			new Thread() {
+				public void run() {
+					testClient(cport, timeout, downloadFolder);
+				}
+			}.start();
+		}*/
+	}
+	
+	public static void testClient(int cport, int timeout, File downloadFolder) {
+		Client client = null;
+		
+		try {
+			
+			client = new Client(cport, timeout, Logger.LoggingType.ON_FILE_AND_TERMINAL);
+		
+			try { client.connect(); } catch(IOException e) { e.printStackTrace(); return; }
+			
+			try { list(client); } catch(IOException e) { e.printStackTrace(); }
+			
+			try { client.store(new File("Clipboard01.pdf")); } catch(IOException e) { e.printStackTrace(); }
+			
+			try { client.store(new File("Clipboard01.pdf")); } catch(IOException e) { e.printStackTrace(); }
+
+			try { client.store(new File("Clipboard01.jpg")); } catch(IOException e) { e.printStackTrace(); }
+			
+			String list[] = null;
+			try { list = list(client); } catch(IOException e) { e.printStackTrace(); }
+			
+			if (list != null)
+				for (String filename : list)
+					try { client.load(filename, downloadFolder); } catch(IOException e) { e.printStackTrace(); }
+			
+			if (list != null)
+				for (String filename : list)
+					try { client.remove(filename); } catch(IOException e) { e.printStackTrace(); }
+			try { client.remove(list[0]); } catch(IOException e) { e.printStackTrace(); }
+			
+			try { list(client); } catch(IOException e) { e.printStackTrace(); }
+			
+		} finally {
+			if (client != null)
+				try { client.disconnect(); } catch(Exception e) { e.printStackTrace(); }
+		}
+	}
+
+	public static String[] list(Client client) throws IOException, NotEnoughDstoresException {
+		System.out.println("Retrieving list of files...");
+		String list[] = client.list();
+		
+		System.out.println("Ok, " + list.length + " files:");
+		int i = 0; 
+		for (String filename : list)
+			System.out.println("[" + i++ + "] " + filename);
+		
+		return list;
+	}
+	
+}
diff --git a/testingWithClient/Controller.java b/testingWithClient/Controller.java
new file mode 100644
index 0000000000000000000000000000000000000000..04da24d427b1aa300731ba8c58131761a6d31a1e
--- /dev/null
+++ b/testingWithClient/Controller.java
@@ -0,0 +1,68 @@
+package ftp;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.nio.channels.*;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class Controller extends Server {
+
+    int r;
+    int rbPeriod;
+
+    private ArrayList<DstoreConnection> index;
+
+
+    /**
+     * @desc constructs a controller
+     * @param cport to listen on
+     * @param r replication factor
+     * @param timeout timeout (ms)
+     * @param rbPeriod rebalance period (ms)
+     */
+    public Controller(int cport, int r, int timeout, int rbPeriod) throws IOException {
+        this.port = cport;
+        this.r = r;
+        this.timeout = timeout;
+        this.rbPeriod = rbPeriod;
+
+        start();
+    }
+
+
+    public static void main(String args[]) {
+        Stream<String> str = Arrays.stream(args);
+
+        List<Integer> intArgs = str.map(x -> {return Integer.parseInt(x);})
+                .collect(Collectors.toList());
+
+        try {
+            Controller ctrl = new Controller(intArgs.get(0), intArgs.get(1), intArgs.get(2), intArgs.get(3));
+        } catch (IOException e) {
+            System.out.println("IOException " + e.getMessage());
+        }
+    }
+
+
+    @Override
+    protected void handleRequest(String request, Socket socket) {
+        String args[] = request.split(" ");
+
+        switch(args[0]) {
+            case "JOIN":
+                new DstoreConnection(new Index(), Integer.parseInt(args[1]));
+
+                try { send("LIST",socket); }
+                catch (Exception e) {
+                    System.err.println("Error: " + e);
+                }
+
+                break;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/testingWithClient/Dstore.java b/testingWithClient/Dstore.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c031e372a53840af15356303d41aa1a34c99272
--- /dev/null
+++ b/testingWithClient/Dstore.java
@@ -0,0 +1,98 @@
+package ftp;
+
+import ftp.DstoreConnection;
+import ftp.Index;
+import ftp.Server;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.SocketChannel;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class Dstore extends Server {
+
+    int cport;
+    String file_folder;
+
+    private static SocketChannel toController;
+
+
+    /**
+     * @desc constructs a client
+     * @param port port to listen on
+     * @param cport controller port to talk to
+     * @param timeout timeout (ms)
+     * @param file_folder where to store data locally
+     */
+    public Dstore(int port, int cport, int timeout, String file_folder) throws IOException{
+        this.port = port;
+        this.cport = cport;
+        this.timeout = timeout;
+        this.file_folder = file_folder;
+
+        Socket ctrlSocket = new Socket("localhost",cport);
+
+        try {send("JOIN " + port, ctrlSocket);}
+        catch (Exception e) {
+            System.err.println("Error: " + e);
+        }
+
+        start();
+    }
+
+
+    public static void main(String args[]) {
+        String numberArgs[] = Arrays.copyOf(args, args.length-1);
+        Stream<String> str = Arrays.stream(numberArgs);
+
+        List<Integer> intArgs = str.map(x -> {return Integer.parseInt(x);})
+                .collect(Collectors.toList());
+
+        try {
+            Dstore dstore = new Dstore(intArgs.get(0), intArgs.get(1), intArgs.get(2), args[3]);
+        } catch (IOException e) {
+            System.out.println("IOException " + e.getMessage());
+        }
+    }
+
+
+//    /**
+//     * @desc lists the files of the datastore
+//     * @return
+//     */
+//    private File[] list() {
+//        File folder = new File("./storage");
+//        return folder.listFiles();
+//    }
+
+
+    @Override
+    protected void handleRequest(String request, Socket socket) {
+        String args[] = request.split(" ");
+
+        switch(args[0]) {
+            case "LIST":
+                File folder = new File("storage");
+                String[] files = folder.list();
+
+                String fileNames = Arrays.stream(files)
+                        .reduce("", (file1, file2) -> file1 + " " + file2);
+
+                try {send(fileNames, socket);}
+                catch (Exception e) {
+                    System.err.println("Error: " + e);
+                }
+
+                break;
+        }
+    }
+
+}
diff --git a/testingWithClient/DstoreConnection.java b/testingWithClient/DstoreConnection.java
new file mode 100644
index 0000000000000000000000000000000000000000..fbc3f2ec70cd3a84a98050966919ddb29254d47d
--- /dev/null
+++ b/testingWithClient/DstoreConnection.java
@@ -0,0 +1,14 @@
+package ftp;
+
+public class DstoreConnection {
+
+    private Index file_index;
+    private int port;
+
+
+    public DstoreConnection(Index file_index, int port) {
+        this.file_index = file_index;
+        this.port = port;
+    }
+
+}
diff --git a/testingWithClient/DstoreFile.java b/testingWithClient/DstoreFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d79a776368e3761320119a5774360630d782a95
--- /dev/null
+++ b/testingWithClient/DstoreFile.java
@@ -0,0 +1,11 @@
+package ftp;
+
+public class DstoreFile {
+    private String filename;
+    private int filesize;
+
+    public DstoreFile(String filename, int filesize) {
+        this.filename = filename;
+        this.filesize = filesize;
+    }
+}
diff --git a/testingWithClient/Index.java b/testingWithClient/Index.java
new file mode 100644
index 0000000000000000000000000000000000000000..7537564a4da24e10e2a66825b11c396c964ed67c
--- /dev/null
+++ b/testingWithClient/Index.java
@@ -0,0 +1,26 @@
+package ftp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Index {
+
+    private ArrayList<DstoreFile> files = new ArrayList<DstoreFile>();
+
+
+    public Index() {}
+
+    public Index(List<DstoreFile> files) {
+        this.files = new ArrayList<DstoreFile>(files);
+    }
+
+
+    public void addFile(String filename, int filesize) {
+        files.add(new DstoreFile(filename,filesize));
+    }
+
+    public ArrayList<DstoreFile> getIndex() {
+        return files;
+    }
+
+}
diff --git a/testingWithClient/Server.java b/testingWithClient/Server.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa93c5a8311e049b9ad1286e7a58142ce1261a48
--- /dev/null
+++ b/testingWithClient/Server.java
@@ -0,0 +1,49 @@
+package ftp;
+
+import java.io.*;
+import java.net.*;
+
+public abstract class Server {
+
+    protected int port;
+    protected int timeout;
+
+
+    protected void start() {
+        try {
+            ServerSocket ss = new ServerSocket(port);
+            while (true) {
+                try {
+                    final Socket client = ss.accept();
+                    new Thread(new Runnable() {
+                        public void run() {
+                            try {
+                                BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
+                                String request = in.readLine();
+                                System.out.println("Recieved: " + request);
+                                handleRequest(request, client);
+                                client.close();
+                            } catch (Exception e) {}
+                        }
+                    }).start();
+                } catch (Exception e) {
+                    System.out.println("error " + e);
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("error " + e);
+        }
+    }
+
+
+    protected abstract void handleRequest(String request, Socket socket);
+
+
+    protected void send(String msg, Socket socket) throws Exception {
+        PrintWriter out = new PrintWriter(socket.getOutputStream());
+        out.println(msg);
+        out.flush();
+        System.out.println("Sent: " + msg);
+    }
+
+}
\ No newline at end of file
diff --git a/testingWithClient/client-1.0.1.jar b/testingWithClient/client-1.0.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..4502bd2181f7d90077ecb50b7c616e435d098ce3
Binary files /dev/null and b/testingWithClient/client-1.0.1.jar differ