diff --git a/banking-client/src/main/java/ufrn/imd/BankingClientApp.java b/banking-client/src/main/java/ufrn/imd/BankingClientApp.java
index bf72420c1c95a5e79e86df3ee5c5464009708735..ec24073376307e263622c48c97ca5f54839dbc16 100644
--- a/banking-client/src/main/java/ufrn/imd/BankingClientApp.java
+++ b/banking-client/src/main/java/ufrn/imd/BankingClientApp.java
@@ -1,30 +1,26 @@
 package ufrn.imd;
 
 import lombok.extern.java.Log;
-import ufrn.imd.controller.Controller;
-import ufrn.imd.domain.Account;
-import ufrn.imd.domain.Client;
 import ufrn.imd.utils.MachineState;
 
 import java.net.MalformedURLException;
-import java.rmi.Naming;
 import java.rmi.NotBoundException;
 import java.rmi.RemoteException;
 
-import static ufrn.imd.utils.MachineState.*;
-import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE;
-
 @Log
 public class BankingClientApp {
     public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
 
         MachineState mS = new MachineState();
 
-        while(mS.quit()) {
-            mS.render();
-            mS.processEvents();
-            mS.update();
-        }
+        for(;;) {
+            while(!mS.hasUser()) mS.login();
 
+            while(mS.quit() || mS.hasUser()) {
+                mS.render();
+                mS.processEvents();
+                mS.update();
+            }
+        }
     }
 }
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 4f1834f4fe00066168878d3ae62f93f2c7b19f2e..87a951fd94736a6d5b2f7c0961282bec8d34b134 100644
--- a/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
+++ b/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
@@ -34,12 +34,36 @@ public class MachineState {
     private Scanner sc;
     private String inputValue;
 
+    private Client client;
+
     public MachineState() {
         state = INITIAL;
         inputValue = new String();
         sc = new Scanner(System.in);
     }
 
+    public void login() throws MalformedURLException, NotBoundException, RemoteException {
+        System.out.println(">>> Please enter your bank account number");
+        String accountNumber = sc.nextLine();
+
+        Controller server = (Controller) Naming.lookup(HOST_AUTHENTICATOR_SERVICE);
+        ServerResponse response = server.getResponse(accountNumber);
+        if(response.getStatus() == 200) {
+            state = INITIAL;
+            this.client = new Client((Integer) response.getBody());
+        } else System.out.println(">>> Bad credentials");
+
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Boolean hasUser() {
+        return client != null;
+    }
+
     public Boolean quit() {
         return !state.equals(QUIT);
     }
@@ -77,8 +101,7 @@ public class MachineState {
             }
         } else if(state.equals(DEPOSIT)) {
             String v = sc.nextLine();
-            Client client = new Client(1);
-            DepositMessage depositMessage = new DepositMessage(client, Double.parseDouble(v));
+            DepositMessage depositMessage = new DepositMessage(this.client, Double.parseDouble(v));
             Controller server = (Controller) Naming.lookup(HOST_DEPOSIT_SERVICE);
             ServerResponse response = server.getResponse(depositMessage);
             if(response.getStatus() == 200) {
@@ -93,9 +116,8 @@ public class MachineState {
             }
 
         } else if(state.equals(BALANCE)) {
-            Client client = new Client(1);
             Controller server = (Controller) Naming.lookup(HOST_BALANCE_SERVICE);
-            ServerResponse response = server.getResponse(client);
+            ServerResponse response = server.getResponse(this.client);
             if(response.getStatus() == 200) {
                 System.out.println(
                         String.format(">>> Your balance is: %.2f", ((Account)response.getBody()).getBalance())
@@ -109,8 +131,7 @@ public class MachineState {
 
         } else if(state.equals(WITHDRAWAL)) {
             String v = sc.nextLine();
-            Client client = new Client(1);
-            WithdrawalMessage withdrawalMessage = new WithdrawalMessage(client, Double.parseDouble(v));
+            WithdrawalMessage withdrawalMessage = new WithdrawalMessage(this.client, Double.parseDouble(v));
             Controller server = (Controller) Naming.lookup(HOST_WITHDRAWAL_SERVICE);
             ServerResponse response = server.getResponse(withdrawalMessage);
             if(response.getStatus() == 200) {
@@ -132,9 +153,8 @@ public class MachineState {
             System.out.println(">>> Please enter with the value that you want transfer");
             String v = sc.nextLine();
 
-            Client client = new Client(1);
             Account account = new Account(null, accountNumber, null);
-            TransferMessage transferMessage = new TransferMessage(client, account, Double.parseDouble(v));
+            TransferMessage transferMessage = new TransferMessage(this.client, account, Double.parseDouble(v));
             Controller server = (Controller) Naming.lookup(HOST_TRANSFER_SERVICE);
             ServerResponse response = server.getResponse(transferMessage);
             if(response.getStatus() == 200) {
@@ -151,6 +171,14 @@ public class MachineState {
             } catch (InterruptedException e) {
                 throw new RuntimeException(e);
             }
+        } else if(state.equals(QUIT)) {
+            this.client = null;
+            System.out.println(">>> You have logged out");
+            try {
+                Thread.sleep(1000);
+            } 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 3cc1c46f5f9d8cced8686b7065fcf43128a4d6c2..c6b21564c0d2aadf51ccbba80225e526a94c794e 100644
--- a/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
+++ b/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
@@ -1,10 +1,12 @@
 package ufrn.imd.utils;
 
 public class NameSpace {
+    public final static Integer PORT_AUTHENTICATOR_SERVICE = 1905;
     public final static Integer PORT_WITHDRAWAL_SERVICE = 1906;
     public static final Integer PORT_DEPOSIT_SERVICE = 1907;
     public static final Integer PORT_BALANCE_SERVICE = 1908;
     public static final Integer PORT_TRANSFER_SERVICE = 1909;
+    public final static String HOST_AUTHENTICATOR_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_AUTHENTICATOR_SERVICE, "authenticator");
     public final static String HOST_WITHDRAWAL_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_WITHDRAWAL_SERVICE, "withdrawal");
     public static final String HOST_DEPOSIT_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit");
     public static final String HOST_BALANCE_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_BALANCE_SERVICE, "balance");
diff --git a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
index 24f0ed8baec50747419f805562f02f0a63a2ac7f..0b064716671e8d2c805aee33436ade6ff714abc3 100644
--- a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
+++ b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
@@ -1,15 +1,9 @@
 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.TransferControllerImpl;
-import ufrn.imd.controller.impl.WithdrawalControllerImpl;
+import ufrn.imd.controller.impl.*;
 import ufrn.imd.repository.impl.ClientRepository;
-import ufrn.imd.service.impl.BalanceServiceImpl;
-import ufrn.imd.service.impl.DepositServiceImpl;
-import ufrn.imd.service.impl.TransferServiceImpl;
-import ufrn.imd.service.impl.WithdrawalServiceImpl;
+import ufrn.imd.service.impl.*;
 
 import java.net.MalformedURLException;
 import java.rmi.AlreadyBoundException;
@@ -22,10 +16,12 @@ public class BankingServerApp {
         BalanceServiceImpl balanceService = new BalanceServiceImpl(clientRepository);
         WithdrawalServiceImpl withdrawalService = new WithdrawalServiceImpl(clientRepository);
         TransferServiceImpl transferService = new TransferServiceImpl(clientRepository);
+        AuthenticatorServiceImpl authenticatorService = new AuthenticatorServiceImpl(clientRepository);
 
         Controller depositController = new DepositControllerImpl(depositService);
         Controller balanceController = new BalanceControllerImpl(balanceService);
         Controller withdrawalController = new WithdrawalControllerImpl(withdrawalService);
         Controller transferController = new TransferControllerImpl(transferService);
+        Controller authenticatorController = new AuthenticatorControllerImpl(authenticatorService);
     }
 }
diff --git a/banking-server/src/main/java/ufrn/imd/controller/impl/AuthenticatorControllerImpl.java b/banking-server/src/main/java/ufrn/imd/controller/impl/AuthenticatorControllerImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c3770f8fbb80b527ffba9e8abddb4e40e9f04ce
--- /dev/null
+++ b/banking-server/src/main/java/ufrn/imd/controller/impl/AuthenticatorControllerImpl.java
@@ -0,0 +1,47 @@
+package ufrn.imd.controller.impl;
+
+import lombok.extern.java.Log;
+import ufrn.imd.controller.Controller;
+import ufrn.imd.service.impl.AuthenticatorServiceImpl;
+import ufrn.imd.utils.ServerResponse;
+
+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 static ufrn.imd.utils.NameSpace.HOST_AUTHENTICATOR_SERVICE;
+import static ufrn.imd.utils.NameSpace.PORT_AUTHENTICATOR_SERVICE;
+
+@Log
+public class AuthenticatorControllerImpl extends UnicastRemoteObject implements Controller {
+    private final AuthenticatorServiceImpl service;
+
+    public AuthenticatorControllerImpl(AuthenticatorServiceImpl service) throws RemoteException, MalformedURLException, AlreadyBoundException {
+        super();
+        log.info("Starting Authenticator service!");
+        this.service = service;
+        log.info(String.format("Initializing server in %s", HOST_AUTHENTICATOR_SERVICE));
+        LocateRegistry.createRegistry(PORT_AUTHENTICATOR_SERVICE);
+        Naming.bind(HOST_AUTHENTICATOR_SERVICE, this);
+    }
+
+    @Override
+    public ServerResponse getResponse(Object client) throws RemoteException {
+        String accountNumber = (String) client;
+        ServerResponse response;
+        try {
+            response = this.service.authenticate(accountNumber);
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+            response = ServerResponse.builder()
+                    .status(500)
+                    .message(e.getMessage())
+                    .body(accountNumber)
+                    .build();
+        }
+        return response;
+    }
+}
diff --git a/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java b/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java
index 50d9cb87a9e624e039f790f7cad9bfdb09e97fb4..aaab87695df120da3091fb1fcc6ee13f6637a5a9 100644
--- a/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java
+++ b/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java
@@ -27,7 +27,7 @@ public class BalanceControllerImpl extends UnicastRemoteObject implements Contro
 
         LocateRegistry.createRegistry(PORT_BALANCE_SERVICE);
         Naming.bind(HOST_BALANCE_SERVICE, this);
-        log.info("Starting Deposit service!");
+        log.info("Starting Balance service!");
         this.service = service;
         log.info(String.format("Initializing server in %s", HOST_BALANCE_SERVICE));
 
diff --git a/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java b/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java
index 22520da111f7fd8d9af0f94b6845501c69d1c236..a893a7bf30fec8e343488a9131ca803b32a1924a 100644
--- a/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java
+++ b/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java
@@ -9,8 +9,8 @@ import java.util.Optional;
 
 public class ClientRepository implements Repository<Client> {
     List<Client> clients = List.of(
-            new Client(1, "Fernando Feirreira", new Account(1, "321456789", 200.00)),
-            new Client(2, "Maria Eduarda", new Account(2, "987654321", 100.00))
+            new Client(0, "Fernando Feirreira", new Account(1, "321456789", 200.00)),
+            new Client(1, "Maria Eduarda", new Account(2, "987654321", 100.00))
             );
 
     @Override
diff --git a/banking-server/src/main/java/ufrn/imd/service/impl/AuthenticatorServiceImpl.java b/banking-server/src/main/java/ufrn/imd/service/impl/AuthenticatorServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7ef11395da621fa8d624a9af57ca56b70490c8f
--- /dev/null
+++ b/banking-server/src/main/java/ufrn/imd/service/impl/AuthenticatorServiceImpl.java
@@ -0,0 +1,29 @@
+package ufrn.imd.service.impl;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.java.Log;
+import ufrn.imd.domain.Client;
+import ufrn.imd.repository.Repository;
+import ufrn.imd.repository.impl.ClientRepository;
+import ufrn.imd.service.Service;
+import ufrn.imd.utils.ServerResponse;
+
+@Log
+@AllArgsConstructor
+public class AuthenticatorServiceImpl implements Service {
+
+    private final Repository<Client> clientRepository;
+
+    public ServerResponse authenticate(String accountNumber) {
+        Client client = ((ClientRepository) clientRepository).findByAccountNumber(accountNumber)
+                .orElseThrow(() -> new RuntimeException(
+                        String.format("Customer not found with account number %s", accountNumber)));
+
+        log.info(client.getName() + " logged in (account number: " + client.getAccount().getNumber() + ")");
+        return ServerResponse.builder()
+                .status(200)
+                .message("Operation sucessed!")
+                .body(client.getId())
+                .build();
+    }
+}
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 fe82fc880f2ddf63a9c7014be14a81ce89fc9c93..b3b8007682278a551965350ca6374227dfa65dff 100644
--- a/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
+++ b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
@@ -5,6 +5,7 @@ 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 Integer PORT_AUTHENTICATOR_SERVICE = 1905;
 
     public final static String HOST_DEPOSIT_SERVICE =
             String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit");
@@ -17,4 +18,7 @@ public class NameSpace {
 
     public final static String HOST_TRANSFER_SERVICE =
             String.format("rmi://127.0.0.1:%d/%s", PORT_TRANSFER_SERVICE, "transfer");
+
+    public final static String HOST_AUTHENTICATOR_SERVICE =
+            String.format("rmi://127.0.0.1:%d/%s", PORT_AUTHENTICATOR_SERVICE, "authenticator");
 }
diff --git a/banking-server/target/classes/ufrn/imd/BankingServerApp.class b/banking-server/target/classes/ufrn/imd/BankingServerApp.class
index 8d5ef782c69ac0f87e6afb4dd4b59b1497d69553..d2be3c2c2aa3de8f81a018455bbf467e4d6bfe88 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/controller/impl/BalanceControllerImpl.class b/banking-server/target/classes/ufrn/imd/controller/impl/BalanceControllerImpl.class
index e990c821bbca67e3753e9d7b7726bf02f8827d69..d21c3306c0a4f767e4fda868fd072ae710e59058 100644
Binary files a/banking-server/target/classes/ufrn/imd/controller/impl/BalanceControllerImpl.class and b/banking-server/target/classes/ufrn/imd/controller/impl/BalanceControllerImpl.class differ
diff --git a/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.class b/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.class
index c6d086468a406fbde73aefe262c8388575fe861e..9274fcdcb68e9bfc2d8548d156fd2a0d114e1228 100644
Binary files a/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.class and b/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.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 42a6dfd302b25b75da9780c5ae89421c50754d76..bca364926d480d38728b84a028f4af2299447065 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