diff --git a/src/pom.xml b/src/pom.xml
index 48e0cc603429eb52f88f7e118308374ae767394f..76346e117d37e388a58b793bbaf4e5daeb73341a 100755
--- a/src/pom.xml
+++ b/src/pom.xml
@@ -51,6 +51,15 @@
         <plugin>
           <artifactId>maven-jar-plugin</artifactId>
           <version>3.0.2</version>
+          <configuration>
+            <archive>
+              <manifest>
+                <addClasspath>true</addClasspath>
+                <classpathPrefix>lib/</classpathPrefix>
+                <mainClass>com.theophilecosse.App</mainClass>
+              </manifest>
+            </archive>
+          </configuration>          
         </plugin>
         <plugin>
           <artifactId>maven-install-plugin</artifactId>
diff --git a/src/server.py b/src/server.py
new file mode 100644
index 0000000000000000000000000000000000000000..461c25ddcbcf396eeebc0a610afad3444415869c
--- /dev/null
+++ b/src/server.py
@@ -0,0 +1,42 @@
+import os
+import logging
+from pyftpdlib.authorizers import DummyAuthorizer
+from pyftpdlib.handlers import FTPHandler
+from pyftpdlib.servers import FTPServer
+
+def main():
+    # Instantiate a dummy authorizer for managing 'virtual' users
+    authorizer = DummyAuthorizer()
+
+    # Define a new user having full r/w permissions and a read-only
+    # anonymous user
+    authorizer.add_user('theophile', 'pw12345', '/home/theophile', perm='elradfmwMT')
+    authorizer.add_anonymous('/home/theophile/tmpdir')
+
+    logging.basicConfig(level=logging.DEBUG)
+
+    # Instantiate FTP handler class
+    handler = FTPHandler
+    handler.authorizer = authorizer
+
+    # Define a customized banner (string returned when client connects)
+    handler.banner = "Test server ftp"
+
+    # Specify a masquerade address and the range of ports to use for
+    # passive connections.  Decomment in case you're behind a NAT.
+    #handler.masquerade_address = '151.25.42.11'
+    #handler.passive_ports = range(60000, 65535)
+
+    # Instantiate FTP server class and listen on 0.0.0.0:2121
+    address = ('', 21212)
+    server = FTPServer(address, handler)
+
+    # set a limit for connections
+    server.max_cons = 256
+    server.max_cons_per_ip = 5
+
+    # start ftp server
+    server.serve_forever()
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/src/server.sh b/src/server.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b8ce94956a813f5919079c99d20c18181b52a311
--- /dev/null
+++ b/src/server.sh
@@ -0,0 +1 @@
+python3 -m pyftpdlib -u theophile -P testmdp  -p 21212 -D 
\ No newline at end of file
diff --git a/src/src/main/java/com/theophilecosse/App.java b/src/src/main/java/com/theophilecosse/App.java
index 95b1e664f7fb49a5985ce7d9aef741e155f4268e..ad52f5ab2e6a8adc09d48131386061912544fba2 100644
--- a/src/src/main/java/com/theophilecosse/App.java
+++ b/src/src/main/java/com/theophilecosse/App.java
@@ -1,13 +1,25 @@
 package com.theophilecosse;
 
+import java.io.IOException;
+
+import com.theophilecosse.client.FTPClient;
+
 /**
  * Hello world!
  *
  */
-public class App 
-{
-    public static void main( String[] args )
-    {
-        System.out.println( "Hello World!" );
+public class App {
+    public static void main(String[] args) {
+        System.out.println(args[0] + "|" + args[1] + "|" + args[2] + "|" + args[3]);
+        try {
+            FTPClient ftpClient = new FTPClient(args[0], Integer.parseInt(args[1]));
+
+            ftpClient.login(args[2], args[3]);
+            ftpClient.setPort();
+            ftpClient.list();
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.out.println("unable to create FTP Client");
+        }
     }
 }
diff --git a/src/src/main/java/com/theophilecosse/client/FTPClient.java b/src/src/main/java/com/theophilecosse/client/FTPClient.java
index 8d85f66179450e83cf2bf94bd312fd853fb2a3c4..933e6de40d5385d74aeac504cc1a4b1034b44955 100644
--- a/src/src/main/java/com/theophilecosse/client/FTPClient.java
+++ b/src/src/main/java/com/theophilecosse/client/FTPClient.java
@@ -1,14 +1,115 @@
 package com.theophilecosse.client;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+
 /**
  * FTPClient
  */
 public class FTPClient {
 
-    private String ip;
+    private int port;
+
+    private boolean isDataChannelOpen;
+
+    private Socket controlSocket;
+    private PrintWriter controlWriter;
+    private BufferedReader controlReader;
+    private ServerSocket serverDataSocket;
+    private Socket dataSocket;
+    private PrintWriter dataWriter;
+    private BufferedReader dataReader;
+
+    public FTPClient(String ip, int port) throws IOException {
+        isDataChannelOpen = false;
+        this.port = port;
+        controlSocket = new Socket(ip, port);
+        controlWriter = new PrintWriter(controlSocket.getOutputStream(), true);
+        controlReader = new BufferedReader(new InputStreamReader(controlSocket.getInputStream()));
+        serverDataSocket = new ServerSocket(21210);
+    }
+    public void openDataChannel() throws IOException {
+        dataSocket = serverDataSocket.accept();
+        dataWriter = new PrintWriter(dataSocket.getOutputStream(), true);
+        dataReader = new BufferedReader(new InputStreamReader(dataSocket.getInputStream()));        
+    }
+
+    public void setPort() throws IOException {
+        this.sendCommand("PORT","127,0,0,1,82,218");
+    }
+
+    public void list() throws IOException {
+        System.out.println("before sending list");
+        this.sendCommand("NLST");
+        System.out.println("list sent");
+        if (!isDataChannelOpen){
+            openDataChannel();
+        }
+        System.out.println("dataConnection Done");
+        System.out.println(readDataUntilCRLF());
+        System.out.println("dataRead done");
+        System.out.println(controlReader.readLine());
+        System.out.println("controle read done");
+    }
+
+    public String readDataUntilCRLF() throws IOException {
+        char CR='a';
+        char LF='a';
+        int lineCount = 0;
+        StringBuilder stringBuilder = new StringBuilder();
+        do {
+            if ((lineCount % 2) == 0){
+                CR = (char) dataReader.read();
+                stringBuilder.append(CR);
+            } else {
+                LF = (char) dataReader.read();
+                stringBuilder.append(CR);
+            }
+            lineCount += 1;
+            
+        } while (!(CR=='\r' && LF=='\n'));
+        //stringBuilder.setLength(stringBuilder.length());
+        return stringBuilder.toString();
+    }
+
+    public void sendCommand(String command,String... arguments){
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append(command);
+        for (String argument : arguments) {
+            stringBuilder.append(' ');
+            stringBuilder.append(argument);
+        }
+        stringBuilder.append("\r\n");
+        controlWriter.print(stringBuilder.toString());
+        controlWriter.flush();
+    }
+
+
+
+    public void login(String username) throws IOException {
+        this.sendCommand("USER",username);
+        System.out.println(controlReader.readLine());
+    }
+ 
+    public void login(String username, String password) throws IOException {
+        this.sendCommand("USER",username);
+        System.out.println(controlReader.readLine());
+        this.sendCommand("PASS",password);
+        System.out.println(controlReader.readLine());
+    }
+
+    public void closeConnection() {
+        try {
+            dataSocket.close();
+            controlSocket.close();
+        } catch (IOException e) {
 
-    public  FTPClient(String ip){
-        this.ip = ip;
+            e.printStackTrace();
+        }
     }
     
 }
\ No newline at end of file