diff --git a/src/ftp/Client.java b/src/ftp/Client.java
index 7da169f19b3119ac71f6c3f1752b1e5d2ec2a26a..b32fb25f42df3677e7483fda83e27d856e8c44e1 100644
--- a/src/ftp/Client.java
+++ b/src/ftp/Client.java
@@ -22,7 +22,7 @@ public class Client {
 
     /**
      * @desc constructs a client
-     * @param cport controller port to use
+     * @param cport controller port to talk to
      * @param timeout timeout (ms)
      */
     public Client(int cport, int timeout) {
@@ -46,7 +46,6 @@ public class Client {
             buffer.clear();
             client.read(buffer);
             response = new String(buffer.array()).trim();
-            System.out.println("response=" + response);
             buffer.clear();
         } catch (IOException e) {
             e.printStackTrace();
@@ -67,14 +66,14 @@ public class Client {
         Scanner scanner = new Scanner(System.in);
         String command = "";
 
-        while (!command.equals("quit")) {
+        while (!command.equals("QUIT")) {
 
             System.out.println("Enter Command:");
             command = scanner.nextLine();
 
             String response = instance.sendMessage(command);
 
-            System.out.println(response);
+            System.out.println("Response: " + response);
 
         }
     }
diff --git a/src/ftp/ClientConnection.java b/src/ftp/ClientConnection.java
new file mode 100644
index 0000000000000000000000000000000000000000..ccf66feb2aa48040ac918f0348f56fff6bd105b9
--- /dev/null
+++ b/src/ftp/ClientConnection.java
@@ -0,0 +1,4 @@
+package ftp;
+
+public class ClientConnection extends Connection {
+}
diff --git a/src/ftp/Connection.java b/src/ftp/Connection.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9933b00d478be2b4370bdf30552b8c71d7fd951
--- /dev/null
+++ b/src/ftp/Connection.java
@@ -0,0 +1,4 @@
+package ftp;
+
+public abstract class Connection {
+}
diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java
index ca52024765bfebc463ec846245d0a76d54799f48..0e0aeda0c86f385e4f635a84a39f764f46d4d5a4 100644
--- a/src/ftp/Controller.java
+++ b/src/ftp/Controller.java
@@ -18,8 +18,6 @@ public class Controller {
     int timeout;
     int rbPeriod;
 
-    private static final String POISON_PILL = "POISON_PILL";
-
 
     /**
      * @desc constructs a controller
@@ -40,7 +38,7 @@ public class Controller {
         serverSocket.bind(new InetSocketAddress(cport));
         serverSocket.configureBlocking(false);
         serverSocket.register(selector, SelectionKey.OP_ACCEPT);
-        ByteBuffer buffer = ByteBuffer.allocate(256);
+        ByteBuffer buffer = ByteBuffer.allocate(256);               //buffer to read/write
 
         while (true) {
             selector.select();
@@ -55,34 +53,34 @@ public class Controller {
                 }
 
                 if (key.isReadable()) {
-                    answerWithEcho(buffer, key);
+                    takeRequest(buffer, key);
                 }
+
                 iter.remove();
             }
         }
     }
 
 
-    private static void answerWithEcho(ByteBuffer buffer, SelectionKey key)
-            throws IOException {
-
+    private static void takeRequest(ByteBuffer buffer, SelectionKey key) throws IOException {
         SocketChannel client = (SocketChannel) key.channel();
         client.read(buffer);
-        if (new String(buffer.array()).trim().equals(POISON_PILL)) {
-            client.close();
-            System.out.println("Not accepting client messages anymore");
-        }
-        else {
-            buffer.flip();
-            client.write(buffer);
-            buffer.clear();
+        String command = new String(buffer.array()).trim();
+        System.out.println("Received: " + command);
+
+        switch(command) {
+            case "DSTORE":
+                key.attach(new DstoreConnection(new Index()));
+                break;
         }
-    }
 
+        buffer.flip();              //reset pos to 0, sets limit to what was wrote, ready for reading
+        client.write(buffer);
+        buffer.clear();             //empties buffer and clears, ready for writing
+    }
 
-    private static void register(Selector selector, ServerSocketChannel serverSocket)
-            throws IOException {
 
+    private static void register(Selector selector, ServerSocketChannel serverSocket) throws IOException {
         SocketChannel client = serverSocket.accept();
         client.configureBlocking(false);
         client.register(selector, SelectionKey.OP_READ);
diff --git a/src/ftp/Dstore.java b/src/ftp/Dstore.java
new file mode 100644
index 0000000000000000000000000000000000000000..962c931021797687544cd2bba37da44a7cbb723e
--- /dev/null
+++ b/src/ftp/Dstore.java
@@ -0,0 +1,125 @@
+package ftp;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class Dstore {
+
+    int port;
+    int cport;
+    int timeout;
+    String file_folder;
+
+    private static SocketChannel dstore;
+    private static ByteBuffer buffer;
+
+
+    /**
+     * @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;
+
+
+        // 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 {
+            dstore = SocketChannel.open(new InetSocketAddress(cport));
+            buffer = ByteBuffer.allocate(256);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        sendMessage("DSTORE");
+
+
+        // creating server socket to receive requests and files
+        //
+        ServerSocketChannel serverSocket = ServerSocketChannel.open();
+        serverSocket.bind(new InetSocketAddress(port));
+        while (true) {
+            SocketChannel client = serverSocket.accept();
+
+            new Thread( () -> {
+
+            } ).start();
+
+        }
+    }
+
+
+    public String sendMessage(String msg) {
+        buffer = ByteBuffer.wrap(msg.getBytes());
+        String response = null;
+        try {
+            dstore.write(buffer);
+            buffer.clear();
+            dstore.read(buffer);
+            response = new String(buffer.array()).trim();
+            buffer.clear();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return response;
+
+    }
+
+
+    private static void takeRequest(ByteBuffer buffer, SelectionKey key)
+            throws IOException {
+
+        SocketChannel client = (SocketChannel) key.channel();
+        client.read(buffer);
+        String command = new String(buffer.array()).trim();
+        System.out.println("Received: " + command);
+
+        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
+    }
+
+
+    private static void register(Selector selector, ServerSocketChannel serverSocket)
+            throws IOException {
+
+        SocketChannel client = serverSocket.accept();
+        client.configureBlocking(false);
+        client.register(selector, SelectionKey.OP_READ);
+    }
+
+
+    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());
+        }
+    }
+
+}
diff --git a/src/ftp/DstoreConnection.java b/src/ftp/DstoreConnection.java
new file mode 100644
index 0000000000000000000000000000000000000000..90b7d34649655c1eb4fd0a221a53bb05caa95276
--- /dev/null
+++ b/src/ftp/DstoreConnection.java
@@ -0,0 +1,12 @@
+package ftp;
+
+public class DstoreConnection extends Connection {
+
+    private Index file_index;
+
+
+    public DstoreConnection(Index file_index) {
+        this.file_index = file_index;
+    }
+
+}
diff --git a/src/ftp/DstoreFile.java b/src/ftp/DstoreFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d79a776368e3761320119a5774360630d782a95
--- /dev/null
+++ b/src/ftp/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/src/ftp/Index.java b/src/ftp/Index.java
new file mode 100644
index 0000000000000000000000000000000000000000..7537564a4da24e10e2a66825b11c396c964ed67c
--- /dev/null
+++ b/src/ftp/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/src/ftp/Server.java b/src/ftp/Server.java
new file mode 100644
index 0000000000000000000000000000000000000000..754bcfd84280eaabbcdfa0919c37b18087dbe2a2
--- /dev/null
+++ b/src/ftp/Server.java
@@ -0,0 +1,5 @@
+package ftp;
+
+public abstract class Server {
+    public abstract void handleRequests();
+}