diff --git a/banking-client/src/main/java/ufrn/imd/utils/MachineState.java b/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
index b7a227b0c320a833e457e69b08612342be8b1292..961c800225f721bcf2322dd1f46e137808598db9 100644
--- a/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
+++ b/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
@@ -11,6 +11,7 @@ import java.rmi.RemoteException;
 import java.util.Scanner;
 
 import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE;
+import static ufrn.imd.utils.NameSpace.HOST_WITHDRAWAL_SERVICE;
 
 @Data
 public class MachineState {
@@ -21,6 +22,7 @@ public class MachineState {
     public static final String READ = "READ";
     public static final String DEPOSIT = "DEPOSIT";
     public static final String BALANCE = "BALANCE";
+    public static final String WITHDRAWAL = "WITHDRAWAL";
 
     public static final String HELP = "HELP";
     public static final String INVALID_INPUT = "INVALID_INPUT";
@@ -51,6 +53,8 @@ public class MachineState {
             state = HELP;
         } else if(state.equals(DEPOSIT)) {
             state = HELP;
+        } else if(state.equals(WITHDRAWAL)) {
+            state = HELP;
         }
     }
 
@@ -59,7 +63,7 @@ public class MachineState {
             inputValue = new String();
             inputValue = sc.nextLine().trim().toUpperCase();
             System.out.println(String.format(">>> input value: %s", inputValue));
-            if(!inputValue.equals(DEPOSIT) && !inputValue.equals(DEPOSIT) && !inputValue.equals(BALANCE)){
+            if(!inputValue.equals(DEPOSIT) && !inputValue.equals(BALANCE) && !inputValue.equals(WITHDRAWAL) ){
                 inputValue = INVALID_INPUT;
             }
         } else if(state.equals(DEPOSIT)) {
@@ -68,6 +72,12 @@ public class MachineState {
             Client client = new Client(1);
             Controller server = (Controller) Naming.lookup(HOST_DEPOSIT_SERVICE);
             server.registerClient(client);
+        } else if(state.equals(WITHDRAWAL)) {
+            double v = sc.nextDouble();
+            System.out.println(String.format(">>> input value: %.2f", v));
+            Client client = new Client(1);
+            Controller server = (Controller) Naming.lookup(HOST_WITHDRAWAL_SERVICE);
+            server.registerClient(client);
         }
     }
 
@@ -80,7 +90,7 @@ public class MachineState {
                 System.out.println("These are the avaliable operations");
                 System.out.println("---------------------------------");
                 System.out.println(" - deposit \t - balance");
-                System.out.println(" - quit");
+                System.out.println(" - withdrawal \t - quit");
 
                 System.out.println("---------------------------------");
                 Thread.sleep(1000);
@@ -92,6 +102,9 @@ public class MachineState {
             } else if(state.equals(DEPOSIT)) {
                 System.out.println(">>> Starting deposit operation");
                 System.out.println(">>> Please enter with the value that you want deposit");
+            } else if(state.equals(WITHDRAWAL)) {
+                System.out.println(">>> Starting withdrawal operation");
+                System.out.println(">>> Please enter the value you want to withdraw");
             }
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
diff --git a/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java b/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
index c3793547e6dee27aa654ce21634053dd6c23b448..25c6d983740bed909d65dfff4eb3034af0524f61 100644
--- a/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
+++ b/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
@@ -3,4 +3,7 @@ package ufrn.imd.utils;
 public class NameSpace {
     public static final Integer PORT_DEPOSIT_SERVICE = 1907;
     public static final String HOST_DEPOSIT_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit");
+
+    public final static Integer PORT_WITHDRAWAL_SERVICE = 1906;
+    public final static String HOST_WITHDRAWAL_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_WITHDRAWAL_SERVICE, "withdrawal");
 }
diff --git a/banking-server/.idea/compiler.xml b/banking-server/.idea/compiler.xml
index 1e78cc9ce0775fa751b7c9ccd7da8294958c203e..0830c9341634c6202b41204c2e6eb85fb959b090 100644
--- a/banking-server/.idea/compiler.xml
+++ b/banking-server/.idea/compiler.xml
@@ -2,6 +2,7 @@
 <project version="4">
   <component name="CompilerConfiguration">
     <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
       <profile name="Maven default annotation processors profile" enabled="true">
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
diff --git a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
index 7acd207f24982bf2667e354a6c1f35b77cf355af..38a2056f1e54ebf485d815de51434dd4866283d8 100644
--- a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
+++ b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
@@ -3,9 +3,11 @@ package ufrn.imd;
 import ufrn.imd.controller.Controller;
 import ufrn.imd.controller.impl.BalanceControllerImpl;
 import ufrn.imd.controller.impl.DepositControllerImpl;
+import ufrn.imd.controller.impl.WithdrawalControllerImpl;
 import ufrn.imd.repository.impl.ClientRepository;
 import ufrn.imd.service.impl.BalanceServiceImpl;
 import ufrn.imd.service.impl.DepositServiceImpl;
+import ufrn.imd.service.impl.WithdrawalServiceImpl;
 
 import java.net.MalformedURLException;
 import java.rmi.AlreadyBoundException;
@@ -16,10 +18,11 @@ public class BankingServerApp {
 
         DepositServiceImpl depositService = new DepositServiceImpl(new ClientRepository());
         BalanceServiceImpl balanceService = new BalanceServiceImpl(new ClientRepository());
+        WithdrawalServiceImpl withdrawalService = new WithdrawalServiceImpl(new ClientRepository());
 
         Controller depositController = new DepositControllerImpl(depositService);
         Controller balanceController = new BalanceControllerImpl(balanceService);
-
+        Controller withdrawalController = new WithdrawalControllerImpl(withdrawalService);
 
     }
 }
diff --git a/banking-server/src/main/java/ufrn/imd/controller/impl/WithdrawalControllerImpl.java b/banking-server/src/main/java/ufrn/imd/controller/impl/WithdrawalControllerImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..9bd03e2a55698094fe343716005ac804b4cf356b
--- /dev/null
+++ b/banking-server/src/main/java/ufrn/imd/controller/impl/WithdrawalControllerImpl.java
@@ -0,0 +1,75 @@
+package ufrn.imd.controller.impl;
+
+import lombok.extern.java.Log;
+import ufrn.imd.controller.Controller;
+import ufrn.imd.domain.Client;
+import ufrn.imd.service.impl.WithdrawalServiceImpl;
+
+import java.net.MalformedURLException;
+import java.rmi.AlreadyBoundException;
+import java.rmi.Naming;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.server.UnicastRemoteObject;
+import java.util.ArrayDeque;
+import java.util.Optional;
+import java.util.Queue;
+
+import static ufrn.imd.utils.NameSpace.HOST_WITHDRAWAL_SERVICE;
+import static ufrn.imd.utils.NameSpace.PORT_WITHDRAWAL_SERVICE;
+
+@Log
+public class WithdrawalControllerImpl extends UnicastRemoteObject implements Controller {
+    private volatile Queue<Client> clients = new ArrayDeque<>();
+
+    public WithdrawalControllerImpl(WithdrawalServiceImpl service) throws RemoteException, MalformedURLException, AlreadyBoundException {
+        super();
+        log.info("Starting Withdrawal service!");
+        new Notify(service).start();
+        log.info(String.format("Initializing server in %s", HOST_WITHDRAWAL_SERVICE));
+        LocateRegistry.createRegistry(PORT_WITHDRAWAL_SERVICE);
+        Naming.bind(HOST_WITHDRAWAL_SERVICE, this);
+    }
+
+    @Override
+    public void registerClient(Client client) throws RemoteException {
+        clients.add(client);
+        log.info("new client registred");
+        log.info(String.format("total users: %d", clients.size()));
+    }
+
+    private class Notify extends Thread {
+        private final WithdrawalServiceImpl service;
+
+        public Notify(WithdrawalServiceImpl service) {
+            super();
+            this.service = service;
+        }
+
+        public void run() {
+            for(;;) {
+                if(clients.size() > 0) {
+                    log.info("notyfing the clients!");
+                    int i = 0;
+                    clients.stream().forEach(client -> {
+                        try {
+                            log.info(String.format("Clients waiting %d", clients.size()));
+                            this.service.withdraw(50.00, Optional.of(client));
+                        } catch (RemoteException | RuntimeException e) {
+                            e.printStackTrace();
+                        } finally {
+                            clients.remove();
+                            log.info(String.format("Clients waiting %d", clients.size()));
+                        }
+                    });
+
+                    try {
+                        Thread.sleep(15 * 1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/banking-server/src/main/java/ufrn/imd/service/impl/WithdrawalServiceImpl.java b/banking-server/src/main/java/ufrn/imd/service/impl/WithdrawalServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a22397cda066cdef5c7f656c3218073c736ce7c1
--- /dev/null
+++ b/banking-server/src/main/java/ufrn/imd/service/impl/WithdrawalServiceImpl.java
@@ -0,0 +1,32 @@
+package ufrn.imd.service.impl;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.java.Log;
+import ufrn.imd.domain.Account;
+import ufrn.imd.domain.Client;
+import ufrn.imd.repository.Repository;
+import ufrn.imd.service.Service;
+
+import java.rmi.RemoteException;
+import java.util.Optional;
+
+@Log
+@AllArgsConstructor
+public class WithdrawalServiceImpl implements Service {
+
+    private final Repository<Client> clientRepository;
+
+    public void withdraw(Double value, Optional<Client> clientOptional) throws RemoteException, RuntimeException {
+        Client user = clientOptional
+                .orElseThrow(() -> new RuntimeException("Null user!"));
+        Client client = clientRepository.find(user.getId())
+                .orElseThrow(() -> new RuntimeException("Invalid user!"));
+
+        Account account = client.getAccount();
+        if(value > account.getBalance()) throw new RuntimeException("Insufficient balance");
+
+        account.setBalance(account.getBalance() - value);
+        log.info("Withdrawal concluded!");
+        log.info(String.format("Account balance: R$ %.2f", account.getBalance()));
+    }
+}
diff --git a/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
index 1c0b20032b7b2212978ada7bae8a9db19bd3775c..d05657df43ae73e13b75ed8d0830f25e4be9910f 100644
--- a/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
+++ b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
@@ -4,10 +4,14 @@ public class NameSpace {
 
     public final static Integer PORT_BALANCE_SERVICE = 1908;
     public final static Integer PORT_DEPOSIT_SERVICE = 1907;
+    public final static Integer PORT_WITHDRAWAL_SERVICE = 1906;
 
     public final static String HOST_DEPOSIT_SERVICE =
             String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit");
 
     public final static String HOST_BALANCE_SERVICE =
             String.format("rmi://127.0.0.1:%d/%s", PORT_BALANCE_SERVICE, "balance");
+
+    public final static String HOST_WITHDRAWAL_SERVICE =
+            String.format("rmi://127.0.0.1:%d/%s", PORT_WITHDRAWAL_SERVICE, "withdrawal");
 }
diff --git a/banking-server/target/classes/ufrn/imd/BankingServerApp.class b/banking-server/target/classes/ufrn/imd/BankingServerApp.class
index e7bc89caf443850f74b54ca56cfedf3e1bb21797..9507e12c0cbcbee3b1aa0bd24708c3ec90f1bb53 100644
Binary files a/banking-server/target/classes/ufrn/imd/BankingServerApp.class and b/banking-server/target/classes/ufrn/imd/BankingServerApp.class differ
diff --git a/banking-server/target/classes/ufrn/imd/utils/NameSpace.class b/banking-server/target/classes/ufrn/imd/utils/NameSpace.class
index 4352c7ac97153fc0ffa5de6fbc6076a0ad780fa8..615ca1f909796027ddf196e31bfa6a831963264c 100644
Binary files a/banking-server/target/classes/ufrn/imd/utils/NameSpace.class and b/banking-server/target/classes/ufrn/imd/utils/NameSpace.class differ