diff --git a/java/services/users/pom.xml b/java/services/users/pom.xml
index 0eca2504ee970c5403bc3a785fa7003c78f82c8e..9ed5a3ede8fd48e11b7b74bba7499f2e5f6d13a5 100644
--- a/java/services/users/pom.xml
+++ b/java/services/users/pom.xml
@@ -52,11 +52,6 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-security</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.auth0</groupId>
-			<artifactId>java-jwt</artifactId>
-			<version>4.4.0</version>
-		</dependency>
 		<dependency>
 			<groupId>jakarta.servlet</groupId>
 			<artifactId>jakarta.servlet-api</artifactId>
diff --git a/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java b/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java
index e7a51f960dcc463c54c0fe0f56c1654bbe4c5025..aafffb5094fa3cf1fad685bdb02b889ffbc107e9 100644
--- a/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java
+++ b/java/services/users/src/main/java/com/uva/api/apis/BookingAPI.java
@@ -16,21 +16,19 @@ public class BookingAPI {
   @Autowired
   private RestTemplate restTemplate;
 
-  @Value("${external.services.bookings.url}")
+  @Value("${services.external.bookings.url}")
   private String BOOKING_API_URL;
 
-  public List<Booking> getAllBookingsByUserId(int id) {
+  public void deleteAllByUserId(int id) {
     String url = BOOKING_API_URL + "?userId={id}";
-    Booking[] bookingsArray = restTemplate
-        .getForObject(url, Booking[].class, id);
-
-    return Arrays.asList(bookingsArray);
-
+    restTemplate.delete(url, id);
   }
 
-  public void deleteAllByUserId(int id) {
+  public List<Booking> getAllByUserId(int id) {
     String url = BOOKING_API_URL + "?userId={id}";
-    restTemplate.delete(url, id);
+    Booking[] bookings = restTemplate.getForObject(url, Booking[].class, id);
+
+    return Arrays.asList(bookings);
   }
 
 }
diff --git a/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java b/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java
index 394ee623e262a748949114e57784ef3fe3002d95..c6541c58c931cfba57ecc717e1c43bea8fd64a40 100644
--- a/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java
+++ b/java/services/users/src/main/java/com/uva/api/apis/HotelApi.java
@@ -11,12 +11,11 @@ public class HotelApi {
   @Autowired
   private RestTemplate restTemplate;
 
-  @Value("${external.services.hotels.url}")
+  @Value("${services.external.hotels.url}")
   private String HOTELS_API;
 
   public void deleteAllByManagerId(Integer id) {
     String url = HOTELS_API + "?managerId={id}";
     restTemplate.delete(url, id);
   }
-
 }
diff --git a/java/services/users/src/main/java/com/uva/api/apis/TokenAPI.java b/java/services/users/src/main/java/com/uva/api/apis/TokenAPI.java
new file mode 100644
index 0000000000000000000000000000000000000000..01941ad762dfdfc3128583d0de2d4680d41b480f
--- /dev/null
+++ b/java/services/users/src/main/java/com/uva/api/apis/TokenAPI.java
@@ -0,0 +1,44 @@
+package com.uva.api.apis;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.uva.api.models.remote.JwtData;
+
+@Component
+public class TokenAPI {
+
+  @Autowired
+  private RestTemplate restTemplate;
+
+  @Value("${spring.application.name}")
+  private String service;
+
+  @Value("${services.internal.token.url}")
+  private String TOKEN_API_URL;
+
+  public JwtData getServiceToken() {
+    String url = TOKEN_API_URL + "/service";
+    Map<String, String> body = new HashMap<>();
+    body.put("service", service);
+    String token = restTemplate.postForObject(url, body, JsonNode.class)
+        .get("token").asText();
+    return decodeToken(token);
+  }
+
+  public JwtData decodeToken(String token) {
+    String url = TOKEN_API_URL + "/info";
+    Map<String, String> body = new HashMap<>();
+    body.put("token", token);
+    JwtData response = restTemplate.postForObject(url, body, JwtData.class);
+    response.setToken(token);
+    return response;
+  }
+
+}
diff --git a/java/services/users/src/main/java/com/uva/api/config/RestTemplateInterceptor.java b/java/services/users/src/main/java/com/uva/api/config/RestTemplateInterceptor.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a6e85f4c3fcfa7d8ce890130417e5807a9124ce
--- /dev/null
+++ b/java/services/users/src/main/java/com/uva/api/config/RestTemplateInterceptor.java
@@ -0,0 +1,31 @@
+package com.uva.api.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.stereotype.Component;
+
+import com.uva.api.services.TokenService;
+
+import java.io.IOException;
+
+@Component
+public class RestTemplateInterceptor implements ClientHttpRequestInterceptor {
+
+  @Autowired
+  private TokenService service;
+
+  @Override
+  public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
+      throws IOException {
+
+    String jwtToken = service.getServiceToken();
+    System.out.println("Using token " + jwtToken);
+
+    request.getHeaders().add("Authorization", "Bearer " + jwtToken);
+
+    return execution.execute(request, body);
+  }
+}
diff --git a/java/services/users/src/main/java/com/uva/api/config/SecurityConfig.java b/java/services/users/src/main/java/com/uva/api/config/SecurityConfig.java
index 5aa0f6e0f22a1b524146320a77777881415510c9..d9720e394866dadef3daa91b42a659cf01d25885 100644
--- a/java/services/users/src/main/java/com/uva/api/config/SecurityConfig.java
+++ b/java/services/users/src/main/java/com/uva/api/config/SecurityConfig.java
@@ -23,32 +23,32 @@ public class SecurityConfig {
 
   @Bean
   SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-    http.csrf(csrf -> csrf.disable());
-    // .authorizeHttpRequests(authorize -> authorize
-    // // Permitir OPTIONS sin autenticación
-    // .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
-    // // Acceso restringido a usuarios y administradores
-    // .requestMatchers("users", "users/**").hasAnyRole(
-    // UserRol.CLIENT.toString(),
-    // UserRol.HOTEL_ADMIN.toString(),
-    // UserRol.ADMIN.toString())
-    // // Acceso restringido a gestores de hoteles y administradores
-    // .requestMatchers(HttpMethod.GET, "hotels", "hotels/*").hasAnyRole(
-    // UserRol.CLIENT.toString(),
-    // UserRol.HOTEL_ADMIN.toString(),
-    // UserRol.ADMIN.toString())
-
-    // .requestMatchers("hotels", "hotels/**")
-    // .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString())
-    // // Acceso restringido a cualquier usuario del sistema
-    // .requestMatchers("bookings", "bookings/**")
-    // .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString(),
-    // UserRol.CLIENT.toString())
-    // // Rechazar el resto
-    // .anyRequest().denyAll())
-    // // Registra el filtro antes del filtro estándar de autenticación
-    // .addFilterBefore(jwtAuthenticationFilter,
-    // UsernamePasswordAuthenticationFilter.class);
+    http.csrf(csrf -> csrf.disable())
+        // .authorizeHttpRequests(authorize -> authorize
+        // // Permitir OPTIONS sin autenticación
+        // .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
+        // // Acceso restringido a usuarios y administradores
+        // .requestMatchers("users", "users/**").hasAnyRole(
+        // UserRol.CLIENT.toString(),
+        // UserRol.HOTEL_ADMIN.toString(),
+        // UserRol.ADMIN.toString())
+        // // Acceso restringido a gestores de hoteles y administradores
+        // .requestMatchers(HttpMethod.GET, "hotels", "hotels/*").hasAnyRole(
+        // UserRol.CLIENT.toString(),
+        // UserRol.HOTEL_ADMIN.toString(),
+        // UserRol.ADMIN.toString())
+
+        // .requestMatchers("hotels", "hotels/**")
+        // .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString())
+        // // Acceso restringido a cualquier usuario del sistema
+        // .requestMatchers("bookings", "bookings/**")
+        // .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString(),
+        // UserRol.CLIENT.toString())
+        // // Rechazar el resto
+        // .anyRequest().denyAll())
+        // // Registra el filtro antes del filtro estándar de autenticación
+        .addFilterBefore(jwtAuthenticationFilter,
+            UsernamePasswordAuthenticationFilter.class);
 
     return http.build();
   }
diff --git a/java/services/users/src/main/java/com/uva/api/controllers/ClientController.java b/java/services/users/src/main/java/com/uva/api/controllers/ClientController.java
new file mode 100644
index 0000000000000000000000000000000000000000..b0e50a3661aaa6719805f8964aca782d8a39f0d7
--- /dev/null
+++ b/java/services/users/src/main/java/com/uva/api/controllers/ClientController.java
@@ -0,0 +1,69 @@
+package com.uva.api.controllers;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PatchMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.HttpClientErrorException;
+
+import com.uva.api.models.ClientStatus;
+import com.uva.api.services.ClientService;
+
+@RestController
+@RequestMapping("users/clients")
+@CrossOrigin(origins = "*")
+public class ClientController {
+
+  @Autowired
+  private ClientService clientService;
+
+  // Clients
+  @GetMapping
+  public ResponseEntity<?> getAllClients() {
+    return clientService.findAll();
+  }
+
+  @GetMapping("/{id}")
+  public ResponseEntity<?> getClientById(@PathVariable int id) {
+    return clientService.findById(id);
+  }
+
+  @PatchMapping("/{id}")
+  public ResponseEntity<?> updateClientState(@PathVariable int id, @RequestBody Map<String, String> json) {
+
+    String strStatus = json.get("status");
+    if (strStatus == null) {
+      return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST);
+    }
+    try {
+      ClientStatus clientStatus = ClientStatus.valueOf(strStatus);
+      return ResponseEntity.ok(clientService.updateClientStatus(id, clientStatus));
+    } catch (IllegalArgumentException e) {
+      return new ResponseEntity<String>("Unknown Client state", HttpStatus.BAD_REQUEST);
+    } catch (HttpClientErrorException e) {
+      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
+        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
+      throw e;
+    }
+  }
+
+  @DeleteMapping("/{id}")
+  public ResponseEntity<?> deleteClient(@PathVariable Integer id) {
+    try {
+      return ResponseEntity.ok(clientService.deleteById(id));
+    } catch (HttpClientErrorException e) {
+      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
+        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
+      throw e;
+    }
+  }
+}
diff --git a/java/services/users/src/main/java/com/uva/api/controllers/ManagerController.java b/java/services/users/src/main/java/com/uva/api/controllers/ManagerController.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5af94d7079356035a34268b2f0e7d7067969fd7
--- /dev/null
+++ b/java/services/users/src/main/java/com/uva/api/controllers/ManagerController.java
@@ -0,0 +1,48 @@
+package com.uva.api.controllers;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.HttpClientErrorException;
+
+import com.uva.api.models.Manager;
+import com.uva.api.services.ManagerService;
+
+@RestController
+@RequestMapping("users/managers")
+@CrossOrigin(origins = "*")
+public class ManagerController {
+
+  @Autowired
+  private ManagerService managerService;
+
+  @GetMapping
+  public ResponseEntity<List<Manager>> getAllHotelManagers() {
+    List<Manager> users = managerService.findAll();
+    return ResponseEntity.ok(users);
+  }
+
+  @GetMapping("/{id}")
+  public ResponseEntity<Manager> getHotelManagerById(@PathVariable Integer id) {
+    return ResponseEntity.ok(managerService.findById(id));
+  }
+
+  @DeleteMapping("/{id}")
+  public ResponseEntity<?> deleteHotelManager(@PathVariable Integer id) {
+    try {
+      return ResponseEntity.ok(managerService.deleteById(id));
+    } catch (HttpClientErrorException e) {
+      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
+        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
+      throw e;
+    }
+  }
+
+}
diff --git a/java/services/users/src/main/java/com/uva/api/controllers/UserController.java b/java/services/users/src/main/java/com/uva/api/controllers/UserController.java
index 4f15524cabd20e6d518fc7be824090b016f65881..38cae78c05aac1345b7ee2121f658f639d68c6cc 100644
--- a/java/services/users/src/main/java/com/uva/api/controllers/UserController.java
+++ b/java/services/users/src/main/java/com/uva/api/controllers/UserController.java
@@ -1,16 +1,13 @@
 package com.uva.api.controllers;
 
-import java.util.List;
 import java.util.Map;
 
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PatchMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
@@ -18,16 +15,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.client.HttpClientErrorException;
-
 import com.fasterxml.jackson.databind.JsonNode;
-import com.uva.api.models.AuthResponse;
-import com.uva.api.models.Client;
-import com.uva.api.models.Manager;
-import com.uva.api.models.User;
-import com.uva.api.models.ClientStatus;
-import com.uva.api.services.ClientService;
-import com.uva.api.services.ManagerService;
+import com.uva.api.models.AuthDTO;
 import com.uva.api.services.UserService;
 import com.uva.api.utils.Utils;
 
@@ -39,19 +28,9 @@ public class UserController {
   @Autowired
   private UserService userService;
 
-  @Autowired
-  private ClientService clientService;
-
-  @Autowired
-  private ManagerService managerService;
-
-  // Common
   @PostMapping
-  public ResponseEntity<?> addUser(@RequestBody AuthResponse body) {
-    User user = new User();
-    BeanUtils.copyProperties(body, user);
-    userService.registerNewUser(user);
-    return new ResponseEntity<User>(user, HttpStatus.ACCEPTED);
+  public ResponseEntity<?> addUser(@RequestBody AuthDTO body) {
+    return userService.registerNewUser(body);
   }
 
   @PutMapping("/{id}")
@@ -63,14 +42,8 @@ public class UserController {
     if (!Utils.notEmptyStrings(name, email)) {
       return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST);
     }
-    try {
-      User user = userService.updateUserData(id, name, email);
-      return new ResponseEntity<User>(user, HttpStatus.OK);
-    } catch (HttpClientErrorException e) {
-      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
-        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
-      throw e;
-    }
+
+    return userService.updateUserData(id, name, email);
   }
 
   @PutMapping("/{id}/password")
@@ -81,122 +54,67 @@ public class UserController {
       return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST);
     }
 
-    try {
-      User user = userService.changePassword(id, password);
-      return new ResponseEntity<User>(user, HttpStatus.OK);
-    } catch (HttpClientErrorException e) {
-      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
-        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
-      throw e;
-    }
+    return userService.changePassword(id, password);
   }
 
+  // TODO aplicarr verificación
+  // @Autowired
+  // private TokenService ser;
+
+  // private String validate(String token) {
+  // JWTData decoded = ser.decodeToken(token);
+  // if (decoded == null) {
+  // return "Invalid token format";
+  // }
+  // UserRol rol = decoded.getRol();
+  // String audience = decoded.getAudience();
+  // boolean a = (rol == null || rol != UserRol.ADMIN);
+  // boolean b = (audience == null || !audience.equals("INTERNAL"));
+  // if (a && b) {
+  // return "Invalid " + a + " " + b;
+  // }
+  // return null;
+
+  // }
+
+  // @GetMapping(params = { "email" })
+  // public ResponseEntity<?> getUserByEmail(@RequestParam String email,
+  // @RequestHeader(value = "Authorization", required = true) String
+  // authorization) {
+  // try {
+  // if (authorization == null) {
+  // return new ResponseEntity<String>("Missing required fields",
+  // HttpStatus.BAD_REQUEST);
+  // }
+  // String m = validate(authorization.substring(7));
+  // if (m != null) {
+  // return new ResponseEntity<String>(m, HttpStatus.BAD_REQUEST);
+  // }
+  // return ResponseEntity.ok(userService.getUserByEmail(email));
+  // } catch (HttpClientErrorException e) {
+  // if (e.getStatusCode() == HttpStatus.NOT_FOUND)
+  // return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
+  // throw e;
+  // }
+  // }
+
   @GetMapping(params = { "email" })
   public ResponseEntity<?> getUserByEmail(@RequestParam String email) {
-    try {
-      return ResponseEntity.ok(userService.getUserByEmail(email));
-    } catch (HttpClientErrorException e) {
-      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
-        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
-      throw e;
-    }
+    return userService.getUserByEmail(email);
   }
 
   @GetMapping
-  public ResponseEntity<List<User>> getAllUsers() {
-    List<User> users = userService.getAllUsers();
-    return ResponseEntity.ok(users);
+  public ResponseEntity<?> getAllUsers() {
+    return userService.getAllUsers();
   }
 
   @GetMapping("/{id}")
   public ResponseEntity<?> getUserById(@PathVariable int id) {
-    return ResponseEntity.ok(userService.getUserById(id));
+    return userService.getUserById(id);
   }
 
   @DeleteMapping("/{id}")
-  public ResponseEntity<?> deleteUser(@PathVariable Integer id) {
-    try {
-      User user = userService.getUserById(id);
-      switch (user.getRol()) {
-        case CLIENT:
-          clientService.deleteById(id);
-          break;
-        case HOTEL_ADMIN:
-          managerService.deleteById(id);
-        default:
-          break;
-      }
-      return ResponseEntity.ok(user);
-    } catch (HttpClientErrorException e) {
-      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
-        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
-      throw e;
-    }
-  }
-
-  // Clients
-  @GetMapping("/clients")
-  public ResponseEntity<List<Client>> getAllClients() {
-    List<Client> users = clientService.findAll();
-    return ResponseEntity.ok(users);
-  }
-
-  @GetMapping("/clients/{id}")
-  public ResponseEntity<Client> getClientById(@PathVariable int id) {
-    return ResponseEntity.ok(clientService.findById(id));
-  }
-
-  @PatchMapping("/clients/{id}")
-  public ResponseEntity<?> updateClientState(@PathVariable int id, @RequestBody Map<String, String> json) {
-
-    String strStatus = json.get("status");
-    if (strStatus == null) {
-      return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST);
-    }
-    try {
-      ClientStatus clientStatus = ClientStatus.valueOf(strStatus);
-      return ResponseEntity.ok(clientService.updateClientStatus(id, clientStatus));
-    } catch (IllegalArgumentException e) {
-      return new ResponseEntity<String>("Unknown Client state", HttpStatus.BAD_REQUEST);
-    } catch (HttpClientErrorException e) {
-      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
-        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
-      throw e;
-    }
-  }
-
-  @DeleteMapping("/clients/{id}")
-  public ResponseEntity<?> deleteClient(@PathVariable Integer id) {
-    try {
-      return ResponseEntity.ok(clientService.deleteById(id));
-    } catch (HttpClientErrorException e) {
-      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
-        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
-      throw e;
-    }
+  public ResponseEntity<?> deleteUser(@PathVariable int id) {
+    return userService.deleteUserById(id);
   }
-
-  // HotelManagers
-  @GetMapping("/managers")
-  public ResponseEntity<List<Manager>> getAllHotelManagers() {
-    List<Manager> users = managerService.findAll();
-    return ResponseEntity.ok(users);
-  }
-
-  @GetMapping("/managers/{id}")
-  public ResponseEntity<Manager> getHotelManagerById(@PathVariable int id) {
-    return ResponseEntity.ok(managerService.findById(id));
-  }
-
-  @DeleteMapping("/managers/{id}")
-  public ResponseEntity<?> deleteHotelManager(@PathVariable Integer id) {
-    try {
-      return ResponseEntity.ok(managerService.deleteById(id));
-    } catch (HttpClientErrorException e) {
-      if (e.getStatusCode() == HttpStatus.NOT_FOUND)
-        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
-      throw e;
-    }
-  }
-
 }
diff --git a/java/services/users/src/main/java/com/uva/api/exceptions/GlobalExceptionHandler.java b/java/services/users/src/main/java/com/uva/api/exceptions/GlobalExceptionHandler.java
index 5681a607c7b0885255a2259e809cb4bb29bf456d..426b2fb250097e33499079693c456069dabc801c 100644
--- a/java/services/users/src/main/java/com/uva/api/exceptions/GlobalExceptionHandler.java
+++ b/java/services/users/src/main/java/com/uva/api/exceptions/GlobalExceptionHandler.java
@@ -12,8 +12,8 @@ import java.util.Map;
 @ControllerAdvice
 public class GlobalExceptionHandler {
 
-    @ExceptionHandler(HotelNotFoundException.class)
-    public ResponseEntity<Map<String, Object>> handleHotelNotFound(HotelNotFoundException ex) {
+    @ExceptionHandler(UserNotFoundException.class)
+    public ResponseEntity<Map<String, Object>> handleUserNotFound(UserNotFoundException ex) {
         Map<String, Object> body = new HashMap<>();
         body.put("timestamp", LocalDateTime.now());
         body.put("message", ex.getMessage());
@@ -21,24 +21,6 @@ public class GlobalExceptionHandler {
         return new ResponseEntity<>(body, HttpStatus.NOT_FOUND);
     }
 
-    @ExceptionHandler(InvalidRequestException.class)
-    public ResponseEntity<Map<String, Object>> handleInvalidRequest(InvalidRequestException ex) {
-        Map<String, Object> body = new HashMap<>();
-        body.put("timestamp", LocalDateTime.now());
-        body.put("message", ex.getMessage());
-
-        return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
-    }
-
-    @ExceptionHandler(InvalidDateRangeException.class)
-    public ResponseEntity<Map<String, Object>> handleInvalidDateRange(InvalidDateRangeException ex) {
-        Map<String, Object> body = new HashMap<>();
-        body.put("timestamp", LocalDateTime.now());
-        body.put("message", ex.getMessage());
-
-        return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
-    }
-
     @ExceptionHandler(Exception.class)
     public ResponseEntity<Map<String, Object>> handleGeneralException(Exception ex) {
         Map<String, Object> body = new HashMap<>();
diff --git a/java/services/users/src/main/java/com/uva/api/exceptions/InvalidDateRangeException.java b/java/services/users/src/main/java/com/uva/api/exceptions/InvalidDateRangeException.java
deleted file mode 100644
index 58bf97d7b6dceb1db771de7058da6f159480a5b9..0000000000000000000000000000000000000000
--- a/java/services/users/src/main/java/com/uva/api/exceptions/InvalidDateRangeException.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.uva.api.exceptions;
-
-public class InvalidDateRangeException extends RuntimeException {
-    public InvalidDateRangeException(String message) {
-        super(message);
-    }
-}
diff --git a/java/services/users/src/main/java/com/uva/api/exceptions/InvalidRequestException.java b/java/services/users/src/main/java/com/uva/api/exceptions/InvalidRequestException.java
deleted file mode 100644
index 677cc4b7cb71bb20c3a9644ff2a8d3552546ea2c..0000000000000000000000000000000000000000
--- a/java/services/users/src/main/java/com/uva/api/exceptions/InvalidRequestException.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.uva.api.exceptions;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ResponseStatus;
-
-@ResponseStatus(HttpStatus.BAD_REQUEST)
-public class InvalidRequestException extends RuntimeException {
-    public InvalidRequestException(String message) {
-        super(message);
-    }
-}
diff --git a/java/services/users/src/main/java/com/uva/api/exceptions/HotelNotFoundException.java b/java/services/users/src/main/java/com/uva/api/exceptions/UserNotFoundException.java
similarity index 60%
rename from java/services/users/src/main/java/com/uva/api/exceptions/HotelNotFoundException.java
rename to java/services/users/src/main/java/com/uva/api/exceptions/UserNotFoundException.java
index dc466f6f5f91da47dbe73c34b97059c817937f13..9d12fb2fe156607f5558986e92d513f85b386d6c 100644
--- a/java/services/users/src/main/java/com/uva/api/exceptions/HotelNotFoundException.java
+++ b/java/services/users/src/main/java/com/uva/api/exceptions/UserNotFoundException.java
@@ -4,8 +4,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ResponseStatus;
 
 @ResponseStatus(HttpStatus.NOT_FOUND) // Devuelve un 404 cuando se lanza la excepción
-public class HotelNotFoundException extends RuntimeException {
-    public HotelNotFoundException(int id) {
-        super("Hotel not found with id: " + id);
+public class UserNotFoundException extends RuntimeException {
+    public UserNotFoundException(int id) {
+        super("User not found with id: " + id);
     }
 }
diff --git a/java/services/users/src/main/java/com/uva/api/filter/JwtAuthenticationFilter.java b/java/services/users/src/main/java/com/uva/api/filter/JwtAuthenticationFilter.java
index a68cb2098ad5b2002c208e7a3ccbb1bdbfbd26f5..18ef31e44129a2333fdbf7d90b52e9c908e02c8c 100644
--- a/java/services/users/src/main/java/com/uva/api/filter/JwtAuthenticationFilter.java
+++ b/java/services/users/src/main/java/com/uva/api/filter/JwtAuthenticationFilter.java
@@ -1,12 +1,10 @@
 package com.uva.api.filter;
 
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.JWTVerifier;
-import com.auth0.jwt.algorithms.Algorithm;
-import com.auth0.jwt.interfaces.DecodedJWT;
 import com.uva.api.models.UserRol;
-import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.uva.api.models.remote.JwtData;
+import com.uva.api.services.TokenService;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -19,21 +17,19 @@ import jakarta.servlet.ServletException;
 import jakarta.servlet.ServletRequest;
 import jakarta.servlet.ServletResponse;
 import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.Filter;
 
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.Collections;
+import java.util.Map;
 
 @Component
 public class JwtAuthenticationFilter implements Filter {
 
-    @Value("${security.jwt.secret-key}")
-    private String secretKey;
-
-    private Algorithm getSigningAlgorithm() {
-        return Algorithm.HMAC256(secretKey); // Usar HMAC256 con la clave secreta
-    }
+    @Autowired
+    private TokenService service;
 
     private String getTokenFromRequest(HttpServletRequest request) {
         String authHeader = request.getHeader("Authorization");
@@ -43,26 +39,17 @@ public class JwtAuthenticationFilter implements Filter {
         return authHeader.substring(7);
     }
 
-    private DecodedJWT validateAndDecodeToken(String token) {
+    private JwtData validateAndDecodeToken(String token) {
         try {
-            JWTVerifier verifier = JWT.require(getSigningAlgorithm()).build();
-            return verifier.verify(token); // Verifica y decodifica el token
-        } catch (JWTVerificationException ex) {
-            System.out.println(
-                    "[" + LocalDateTime.now().toString() + "] Error de verificación del token: " + ex.getMessage());
+            return service.decodeToken(token);
+        } catch (Exception ex) {
+            System.err.println(
+                    "[" + LocalDateTime.now().toString() + "] Error de verificación del token");
+            ex.printStackTrace(System.err);
             return null;
         }
     }
 
-    private String getEmailFromToken(DecodedJWT jwt) {
-        return jwt.getClaim("email").asString();
-    }
-
-    private UserRol getRoleFromToken(DecodedJWT jwt) {
-        String role = jwt.getClaim("rol").asString();
-        return UserRol.valueOf(role);
-    }
-
     private String formatRole(UserRol rol) {
         return String.format("ROLE_%s", rol.toString());
     }
@@ -70,34 +57,42 @@ public class JwtAuthenticationFilter implements Filter {
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
             throws IOException, ServletException {
+
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         String token = getTokenFromRequest(httpRequest);
 
-        System.out.print("[" + LocalDateTime.now().toString() + "] TOKEN: " + token);
+        System.out.println("[" + LocalDateTime.now().toString() + "] TOKEN: " + token);
 
         if (token != null) {
-            DecodedJWT jwt = validateAndDecodeToken(token);
-            System.out.print(" " + jwt.toString() + " ");
+            JwtData jwt = validateAndDecodeToken(token);
             if (jwt != null) {
-                String email = getEmailFromToken(jwt);
-                UserRol role = getRoleFromToken(jwt);
-                System.out.print(" email=" + email + " role=" + role + " ");
-
-                if (email != null && role != null && SecurityContextHolder.getContext().getAuthentication() == null) {
-                    // Crear la autoridad con el rol del token
-                    SimpleGrantedAuthority authority = new SimpleGrantedAuthority(formatRole(role));
-
-                    // Crear autenticación
-                    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(email,
-                            null, Collections.singletonList(authority));
-                    authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
-
-                    // Establecer autenticación en el contexto de seguridad
-                    SecurityContextHolder.getContext().setAuthentication(authentication);
-                }
+                System.out.println("-->" + jwt + "<--");
             }
         }
 
+        // String email = getEmailFromToken(jwt);
+        // UserRol role = getRoleFromToken(jwt);
+        // System.out.print(" email=" + email + " role=" + role + " ");
+
+        // if (email != null && role != null &&
+        // SecurityContextHolder.getContext().getAuthentication() == null) {
+        // // Crear la autoridad con el rol del token
+        // SimpleGrantedAuthority authority = new
+        // SimpleGrantedAuthority(formatRole(role));
+
+        // // Crear autenticación
+        // UsernamePasswordAuthenticationToken authentication = new
+        // UsernamePasswordAuthenticationToken(email,
+        // null, Collections.singletonList(authority));
+        // authentication.setDetails(new
+        // WebAuthenticationDetailsSource().buildDetails(httpRequest));
+
+        // // Establecer autenticación en el contexto de seguridad
+        // SecurityContextHolder.getContext().setAuthentication(authentication);
+        // }
+        // }
+        // }
+
         // Continuar con el resto de filtros
         chain.doFilter(request, response);
     }
diff --git a/java/services/users/src/main/java/com/uva/api/interceptor/AuthHttpInterceptor.java b/java/services/users/src/main/java/com/uva/api/interceptor/AuthHttpInterceptor.java
deleted file mode 100644
index 6e1a9256e6caf024c94dfd4ac49ab17cb982eb87..0000000000000000000000000000000000000000
--- a/java/services/users/src/main/java/com/uva/api/interceptor/AuthHttpInterceptor.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.uva.api.interceptor;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpRequest;
-import org.springframework.http.client.ClientHttpRequestExecution;
-import org.springframework.http.client.ClientHttpResponse;
-import org.springframework.http.client.ClientHttpRequestInterceptor;
-import org.springframework.stereotype.Component;
-
-import com.uva.api.models.UserRol;
-import com.uva.api.utils.JwtUtil;
-
-import java.io.IOException;
-
-@Component
-public class AuthHttpInterceptor implements ClientHttpRequestInterceptor {
-
-  @Autowired
-  private JwtUtil jwtUtil;
-
-  private String token;
-
-  private String getAccessToken() {
-    if (token == null || token.isEmpty()) {
-      // TODO cambiar también si el token ha caducado
-      token = jwtUtil.generateToken("auth", "auth@dev.com", UserRol.ADMIN);
-    }
-    return token;
-
-  }
-
-  @Override
-  public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
-      throws IOException {
-    // Generar o cargar el JWT token desde el bean JwtUtil
-    String jwtToken = getAccessToken();
-
-    // System.out.println("Using token " + jwtToken);
-
-    // Agregar el token al encabezado Authorization
-    request.getHeaders().add("Authorization", "Bearer " + jwtToken);
-
-    // Continuar con la ejecución de la solicitud
-    return execution.execute(request, body);
-  }
-}
diff --git a/java/services/users/src/main/java/com/uva/api/models/AuthResponse.java b/java/services/users/src/main/java/com/uva/api/models/AuthDTO.java
similarity index 82%
rename from java/services/users/src/main/java/com/uva/api/models/AuthResponse.java
rename to java/services/users/src/main/java/com/uva/api/models/AuthDTO.java
index ca8edf2a813699de08326948c55306d2dfbf567e..a340fc6852ccc45d1a608ad6a483e0851e88c1fa 100644
--- a/java/services/users/src/main/java/com/uva/api/models/AuthResponse.java
+++ b/java/services/users/src/main/java/com/uva/api/models/AuthDTO.java
@@ -9,11 +9,11 @@ import lombok.Setter;
 @AllArgsConstructor
 @Getter
 @Setter
-public class AuthResponse {
+public class AuthDTO {
 
   private int id;
   private String name;
   private String email;
   private String password;
-  private UserRol rol;
+  private UserRol rol = UserRol.CLIENT;
 }
diff --git a/java/services/users/src/main/java/com/uva/api/models/Client.java b/java/services/users/src/main/java/com/uva/api/models/Client.java
index 5205bebb8c355c5e9f65b1a7cb4d7c89d53b2a58..71f3a3f207782ca891acfa1cac513ec7fe9fb356 100644
--- a/java/services/users/src/main/java/com/uva/api/models/Client.java
+++ b/java/services/users/src/main/java/com/uva/api/models/Client.java
@@ -1,17 +1,14 @@
 package com.uva.api.models;
 
-import java.time.LocalDate;
 import java.util.List;
 
 import com.uva.api.models.remote.Booking;
 
-import jakarta.persistence.Basic;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
 import jakarta.persistence.EnumType;
 import jakarta.persistence.Enumerated;
 import jakarta.persistence.Table;
-import jakarta.persistence.Transient;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
@@ -29,29 +26,23 @@ import lombok.ToString;
 @EqualsAndHashCode(callSuper = true)
 public class Client extends User {
 
-  @Basic(optional = false)
   @Column(nullable = false)
   @Enumerated(EnumType.STRING)
   private ClientStatus status = ClientStatus.NO_BOOKINGS;
-  @Transient
-  private List<Booking> bookings;
 
   public Client(int id, String name, String email, String password, ClientStatus status,
       List<Booking> bookings) {
     super(id, name, email, password, UserRol.CLIENT);
     setStatus(status);
-    setBookings(bookings);
   }
 
-  public ClientStatus getStatus() {
-    if (getBookings() == null || getBookings().isEmpty())
-      return ClientStatus.NO_BOOKINGS;
-    boolean activeBookings = getBookings().stream()
-        .anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); // reserva >= ahora
-    return activeBookings ? ClientStatus.WITH_ACTIVE_BOOKINGS : ClientStatus.WITH_INACTIVE_BOOKINGS;
-  }
-
-  public void setStatus(ClientStatus status) {
-    this.status = status;
-  }
+  // public ClientStatus getStatus() {
+  // if (getBookings() == null || getBookings().isEmpty())
+  // return ClientStatus.NO_BOOKINGS;
+  // boolean activeBookings = getBookings().stream()
+  // .anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); //
+  // reserva >= ahora
+  // return activeBookings ? ClientStatus.WITH_ACTIVE_BOOKINGS :
+  // ClientStatus.WITH_INACTIVE_BOOKINGS;
+  // }
 }
diff --git a/java/services/users/src/main/java/com/uva/api/models/Manager.java b/java/services/users/src/main/java/com/uva/api/models/Manager.java
index d0b1780186159691d8372adc561515b198e3a242..f72e762b13b73585534608c5e3be25b5ed623ba0 100644
--- a/java/services/users/src/main/java/com/uva/api/models/Manager.java
+++ b/java/services/users/src/main/java/com/uva/api/models/Manager.java
@@ -1,5 +1,6 @@
 package com.uva.api.models;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.databind.JsonNode;
 
 import jakarta.persistence.Entity;
@@ -23,6 +24,7 @@ import lombok.ToString;
 public class Manager extends User {
 
   @Transient
+  @JsonIgnore
   private JsonNode hotels;
 
   public Manager(int id, String name, String email, String password, JsonNode hotels) {
diff --git a/java/services/users/src/main/java/com/uva/api/models/remote/JwtData.java b/java/services/users/src/main/java/com/uva/api/models/remote/JwtData.java
new file mode 100644
index 0000000000000000000000000000000000000000..21774c76be754aacdb2005499b96591ce3459fd9
--- /dev/null
+++ b/java/services/users/src/main/java/com/uva/api/models/remote/JwtData.java
@@ -0,0 +1,36 @@
+package com.uva.api.models.remote;
+
+import java.util.Date;
+
+import com.uva.api.models.UserRol;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@Data
+@ToString
+public class JwtData {
+
+  private String token;
+
+  private Integer id;
+  private String name;
+  private String email;
+  private UserRol rol;
+  private String service;
+
+  private String subject;
+  private String audience;
+  private Long ttl;
+
+  private Date issuedAt;
+  private Date expiresAt;
+
+  public boolean isAdmin() {
+    return rol != null && rol == UserRol.ADMIN;
+  }
+}
\ No newline at end of file
diff --git a/java/services/users/src/main/java/com/uva/api/services/ClientService.java b/java/services/users/src/main/java/com/uva/api/services/ClientService.java
index 146c85d24edc73d6e7c227c60e33c4af3453b20c..81d3f92c2f2cac8108da9263eca42d413118fc9d 100644
--- a/java/services/users/src/main/java/com/uva/api/services/ClientService.java
+++ b/java/services/users/src/main/java/com/uva/api/services/ClientService.java
@@ -1,19 +1,19 @@
 package com.uva.api.services;
 
 import java.time.LocalDate;
-import java.util.ArrayList;
 import java.util.List;
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
 import com.uva.api.apis.BookingAPI;
 import com.uva.api.models.Client;
 import com.uva.api.models.User;
 import com.uva.api.models.UserRol;
-import com.uva.api.models.ClientStatus;
 import com.uva.api.models.remote.Booking;
+import com.uva.api.models.ClientStatus;
 import com.uva.api.repositories.ClientRepository;
 import com.uva.api.utils.Utils;
 
@@ -26,20 +26,13 @@ public class ClientService {
   @Autowired
   private BookingAPI bookingAPI;
 
-  public List<Client> findAll() {
-    return clientRepository.findAll();
+  public ResponseEntity<?> findAll() {
+    return ResponseEntity.ok(clientRepository.findAll());
   }
 
-  public Client findById(int id) {
+  public ResponseEntity<?> findById(int id) {
     Client client = Utils.assertUser(clientRepository.findById(id));
-    List<Booking> bookings;
-    try {
-      bookings = bookingAPI.getAllBookingsByUserId(client.getId());
-    } catch (Exception e) {
-      bookings = new ArrayList<>();
-    }
-    client.setBookings(bookings);
-    return client;
+    return ResponseEntity.ok(client);
   }
 
   public Client deleteById(int id) {
@@ -57,27 +50,30 @@ public class ClientService {
     return clientRepository.save(client);
   }
 
+  // TODO No entiendo donde debería ir esto
   public User updateClientStatus(int id, ClientStatus status) {
     Client user = Utils.assertUser(clientRepository.findById(id));
 
-    boolean activeBookings = user.getBookings().stream()
+    List<Booking> bookings = bookingAPI.getAllByUserId(id);
+
+    boolean activeBookings = bookings.stream()
         .anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); // reserva >= ahora
-    boolean inactiveBookings = user.getBookings().stream()
+    boolean inactiveBookings = bookings.stream()
         .anyMatch(booking -> booking.getEndDate().isBefore(LocalDate.now())); // reserva < ahora
 
     switch (status) {
       case NO_BOOKINGS:
-        if (!user.getBookings().isEmpty())
+        if (!bookings.isEmpty())
           throw new IllegalArgumentException("Invalid State: The user has at least one booking");
         break;
       case WITH_ACTIVE_BOOKINGS:
-        if (user.getBookings().isEmpty())
+        if (bookings.isEmpty())
           throw new IllegalArgumentException("Invalid State: The user don't has bookings");
         if (!activeBookings)
           throw new IllegalArgumentException("Invalid State: The user don't has active bookings");
         break;
       case WITH_INACTIVE_BOOKINGS:
-        if (user.getBookings().isEmpty())
+        if (bookings.isEmpty())
           throw new IllegalArgumentException("Invalid State: The user don't has bookings");
         if (!inactiveBookings)
           throw new IllegalArgumentException("Invalid State: The user don't has inactive bookings");
diff --git a/java/services/users/src/main/java/com/uva/api/services/TokenService.java b/java/services/users/src/main/java/com/uva/api/services/TokenService.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d90bbe4e3f3cecfa444d084c98b01c830163844
--- /dev/null
+++ b/java/services/users/src/main/java/com/uva/api/services/TokenService.java
@@ -0,0 +1,48 @@
+package com.uva.api.services;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.uva.api.apis.TokenAPI;
+import com.uva.api.models.remote.JwtData;
+
+@Service
+public class TokenService {
+
+  @Autowired
+  private TokenAPI api;
+
+  private JwtData ownToken;
+  private Map<String, JwtData> cache = new HashMap<>();
+
+  private boolean expireSoon(JwtData decoded) {
+    return (decoded.getExpiresAt().getTime() - System.currentTimeMillis()) / 1000 <= 10;
+  }
+
+  public String getServiceToken() {
+    if (ownToken == null || expireSoon(ownToken)) {
+      System.out.println("Generando token");
+      long s = System.currentTimeMillis();
+      ownToken = api.getServiceToken();
+      long t = System.currentTimeMillis() - s;
+      System.out.println("Token Generando en " + t + " ms");
+    }
+    return ownToken.getToken();
+  }
+
+  public JwtData decodeToken(String token) {
+    if (cache.containsKey(token))
+      return cache.get(token);
+    System.out.println("Actualizando token");
+    long s = System.currentTimeMillis();
+    JwtData decoded = api.decodeToken(token);
+    long t = System.currentTimeMillis() - s;
+    System.out.println("Actualizando token en " + t + " ms");
+    cache.put(token, decoded);
+    return decoded;
+  }
+
+}
diff --git a/java/services/users/src/main/java/com/uva/api/services/UserService.java b/java/services/users/src/main/java/com/uva/api/services/UserService.java
index deb2e39905bd7f2b6bc80c9eef4e7ae31eb90d01..99f21a10bdcbf39d24b18c16f453d8df5f3523a4 100644
--- a/java/services/users/src/main/java/com/uva/api/services/UserService.java
+++ b/java/services/users/src/main/java/com/uva/api/services/UserService.java
@@ -4,10 +4,10 @@ import java.util.List;
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
-
 import com.uva.api.utils.Utils;
-import com.uva.api.models.AuthResponse;
+import com.uva.api.models.AuthDTO;
 import com.uva.api.models.User;
 import com.uva.api.models.UserRol;
 import com.uva.api.repositories.UserRepository;
@@ -24,63 +24,83 @@ public class UserService {
   @Autowired
   private ManagerService managerService;
 
-  public List<User> getAllUsers() {
-    return userRepository.findAll();
+  public ResponseEntity<List<User>> getAllUsers() {
+    List<User> users = userRepository.findAll();
+    return ResponseEntity.ok(users);
   }
 
-  public User getUserById(int id) {
+  private User assertUserById(int id) {
     return Utils.assertUser(userRepository.findById(id));
   }
 
-  public AuthResponse getUserByEmail(String email) {
+  public ResponseEntity<User> getUserById(int id) {
+    User user = assertUserById(id);
+    return ResponseEntity.ok(user);
+  }
+
+  public ResponseEntity<AuthDTO> getUserByEmail(String email) {
     User u = Utils.assertUser(userRepository.findByEmail(email));
-    AuthResponse auth = new AuthResponse();
+    AuthDTO auth = new AuthDTO();
     BeanUtils.copyProperties(u, auth);
-    return auth;
+    return ResponseEntity.ok(auth);
   }
 
-  public User registerNewUser(User registerRequest) {
-    User newUser;
+  public ResponseEntity<User> registerNewUser(AuthDTO request) {
+    User user = new User();
+    BeanUtils.copyProperties(request, user);
 
     // Aseguramos que tenga un rol, por defecto es cliente
-    if (registerRequest.getRol() == null)
-      registerRequest.setRol(UserRol.CLIENT);
+    if (user.getRol() == null)
+      user.setRol(UserRol.CLIENT);
 
-    switch (registerRequest.getRol()) {
+    switch (user.getRol()) {
       case ADMIN: // Not extracted due to its complexity, it's the same as for the user
         User admin = new User();
-        BeanUtils.copyProperties(registerRequest, admin);
-        newUser = userRepository.save(admin);
+        BeanUtils.copyProperties(user, admin);
+        user = userRepository.save(admin);
         break;
 
       case HOTEL_ADMIN:
-        newUser = managerService.save(registerRequest);
+        user = managerService.save(user);
         break;
 
       case CLIENT: // By default
       default:
-        newUser = clientService.save(registerRequest);
+        user = clientService.save(user);
         break;
     }
-    return newUser;
+    return ResponseEntity.ok(user);
   }
 
-  public User updateUserData(int id, String name, String email) {
-    User user = getUserById(id);
+  public ResponseEntity<User> updateUserData(int id, String name, String email) {
+    User user = assertUserById(id);
     user.setName(name);
     user.setEmail(email);
-    return userRepository.save(user);
+    user = userRepository.save(user);
+    return ResponseEntity.ok(user);
   }
 
-  public User changePassword(int id, String password) {
-    User user = getUserById(id);
+  public ResponseEntity<User> changePassword(int id, String password) {
+    User user = assertUserById(id);
     user.setPassword(password);
-    return userRepository.save(user);
+    user = userRepository.save(user);
+    return ResponseEntity.ok(user);
   }
 
-  public User deleteUserById(int id) {
-    User user = getUserById(id);
-    userRepository.deleteById(id);
-    return user;
+  public ResponseEntity<User> deleteUserById(int id) {
+    User user = assertUserById(id);
+    switch (user.getRol()) {
+      case CLIENT:
+        clientService.deleteById(id);
+        break;
+      case HOTEL_ADMIN:
+        managerService.deleteById(id);
+        break;
+      case ADMIN:
+      default:
+        userRepository.deleteById(id);
+        break;
+    }
+    return ResponseEntity.ok(user);
   }
 }
diff --git a/java/services/users/src/main/java/com/uva/api/utils/JwtUtil.java b/java/services/users/src/main/java/com/uva/api/utils/JwtUtil.java
deleted file mode 100644
index e1d665c2c2332def70988441255a3ee20bf29c5f..0000000000000000000000000000000000000000
--- a/java/services/users/src/main/java/com/uva/api/utils/JwtUtil.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.uva.api.utils;
-
-import java.util.Date;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
-import com.uva.api.models.UserRol;
-
-@Component
-public class JwtUtil {
-
-  @Value("${security.jwt.secret-key}")
-  private String secretKey;
-
-  @Value("${security.jwt.kid}")
-  private String kid;
-
-  @Value("${security.jwt.expiration-time}")
-  private long jwtExpiration;
-
-  public long getExpirationTime() {
-    return jwtExpiration;
-  }
-
-  public String generateToken(String name, String email, UserRol rol) {
-    Algorithm algorithm = Algorithm.HMAC256(secretKey);
-    return JWT
-        .create()
-        .withKeyId(kid)
-        .withClaim("name", name)
-        .withClaim("email", email)
-        .withClaim("rol", rol.toString())
-        .withIssuedAt(new Date())
-        .withExpiresAt(new Date(System.currentTimeMillis() + jwtExpiration * 1000))
-        .sign(algorithm);
-  }
-
-  // TODO estaría guapo recuperar métodos de validación para el token de petición
-  // para este servicio
-}
diff --git a/java/services/users/src/main/resources/application.properties b/java/services/users/src/main/resources/application.properties
index a8ff83c7a248ce7b47b84e45e52fed2c67d254b0..6ad30a8252d53371d2accfd475e783772d1ea2ca 100644
--- a/java/services/users/src/main/resources/application.properties
+++ b/java/services/users/src/main/resources/application.properties
@@ -7,7 +7,6 @@ spring.datasource.username=user
 spring.datasource.password=password
 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
-spring.neo4j.security.hostname-verification-enabled=false
 spring.security.user.name=user
 spring.security.user.password=password
 
@@ -16,5 +15,6 @@ security.jwt.secret-key=MiClaveDeSeguridadMuyLargaParaQueNoFalleSpringBoot
 security.jwt.expiration-time=3600000 
 security.jwt.kid=cYz3kNRLAirxVhHXQ5rh5xKrOwHwZVui
 
-external.services.hotels.url=http://localhost:8301/hotels
-external.services.bookings.url=http://localhost:8401/bookings
\ No newline at end of file
+services.internal.token.url=http://localhost:8101/token/
+services.external.hotels.url=http://localhost:8301/hotels
+services.external.bookings.url=http://localhost:8401/bookings
\ No newline at end of file