Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/WebSecurityConfig.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/WebSecurityConfig.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/WebSecurityConfig.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -46,4 +46,5 @@
                                 "/uploads/**")
                         .permitAll()
+                        .requestMatchers("/api/user/**").authenticated()
                         .requestMatchers("/api/customer/**").hasRole("CUSTOMER")
                         .requestMatchers("/api/admin/**").hasRole("ADMIN")
Index: serveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/CreateUserDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/CreateUserDTO.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package mk.ukim.finki.it.reservengo.dto.userDTO;
-
-
-public record CreateUserDTO(
-        String firstName,
-        String lastName,
-        String email,
-        String password,
-        String phoneNumber
-) {
-}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/DisplayUserDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/DisplayUserDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/DisplayUserDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -0,0 +1,24 @@
+package mk.ukim.finki.it.reservengo.dto.userDTO;
+
+import mk.ukim.finki.it.reservengo.model.domain.User;
+import mk.ukim.finki.it.reservengo.model.enumerations.Role;
+
+public record DisplayUserDTO(
+        Long id,
+        String firstName,
+        String lastName,
+        String email,
+        String phoneNumber,
+        Role role
+) {
+    public static DisplayUserDTO fromUser(User user) {
+        return new DisplayUserDTO(
+                user.getId(),
+                user.getFirstName(),
+                user.getLastName(),
+                user.getEmail(),
+                user.getPhoneNumber(),
+                user.getUserRole()
+        );
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/DisplayUserEmailDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/DisplayUserEmailDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/DisplayUserEmailDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.it.reservengo.dto.userDTO;
+
+import mk.ukim.finki.it.reservengo.model.domain.User;
+
+public record DisplayUserEmailDTO(
+        Long id,
+        String email,
+        String jwt
+) {
+    public static DisplayUserEmailDTO fromUser(User user, String jwt) {
+        return new DisplayUserEmailDTO(
+                user.getId(),
+                user.getEmail(),
+                jwt
+        );
+    }
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserEmailDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserEmailDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserEmailDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -0,0 +1,6 @@
+package mk.ukim.finki.it.reservengo.dto.userDTO;
+
+public record EditUserEmailDTO(
+        String newEmail
+) {
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserPasswordDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserPasswordDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserPasswordDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.it.reservengo.dto.userDTO;
+
+public record EditUserPasswordDTO(
+        String currentPassword,
+        String newPassword
+) {
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserProfileDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserProfileDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/userDTO/EditUserProfileDTO.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -0,0 +1,9 @@
+package mk.ukim.finki.it.reservengo.dto.userDTO;
+
+
+public record EditUserProfileDTO(
+        String firstName,
+        String lastName,
+        String phoneNumber
+) {
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/UserServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/UserServiceImpl.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/UserServiceImpl.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -1,9 +1,11 @@
 package mk.ukim.finki.it.reservengo.service.impl;
 
-import mk.ukim.finki.it.reservengo.dto.userDTO.CreateUserDTO;
+import mk.ukim.finki.it.reservengo.dto.userDTO.*;
 import mk.ukim.finki.it.reservengo.model.domain.User;
 import mk.ukim.finki.it.reservengo.model.exceptions.EmailNotFoundException;
+import mk.ukim.finki.it.reservengo.model.exceptions.UserEmailAlreadyExistsException;
 import mk.ukim.finki.it.reservengo.model.exceptions.UserIdNotFoundException;
 import mk.ukim.finki.it.reservengo.repository.UserRepository;
+import mk.ukim.finki.it.reservengo.service.intf.JWTService;
 import mk.ukim.finki.it.reservengo.service.intf.UserService;
 import org.springframework.security.crypto.password.PasswordEncoder;
@@ -14,8 +16,10 @@
 
     private final UserRepository userRepository;
+    private final JWTService jwtService;
     private final PasswordEncoder passwordEncoder;
 
-    public UserServiceImpl(UserRepository userRepository, PasswordEncoder passwordEncoder) {
+    public UserServiceImpl(UserRepository userRepository, PasswordEncoder passwordEncoder, JWTService jwtService) {
         this.userRepository = userRepository;
+        this.jwtService = jwtService;
         this.passwordEncoder = passwordEncoder;
     }
@@ -37,26 +41,45 @@
 
     @Override
-    public User editUserProfile(Long userId, CreateUserDTO createUserDTO) {
+    public DisplayUserEmailDTO changeEmail(Long userId, EditUserEmailDTO editUserEmailDTO) {
         User user = userRepository.findById(userId).orElseThrow(() -> new UserIdNotFoundException(userId));
-        updateUserFromDto(user, createUserDTO);
-        return userRepository.save(user);
+
+        if (editUserEmailDTO.newEmail().equals(user.getEmail())) {
+            throw new IllegalArgumentException("New email must be different from the current email.");
+        }
+        if (emailExists(editUserEmailDTO.newEmail())) {
+            throw new UserEmailAlreadyExistsException(editUserEmailDTO.newEmail());
+        }
+        user.setEmail(editUserEmailDTO.newEmail());
+
+        userRepository.save(user);
+        String jwt = jwtService.generateToken(user);
+
+        return DisplayUserEmailDTO.fromUser(user, jwt);
     }
 
-    private void updateUserFromDto(User user, CreateUserDTO createUserDTO) {
-        if (createUserDTO.firstName() != null) {
-            user.setFirstName(createUserDTO.firstName());
+    @Override
+    public String changePassword(Long userId, EditUserPasswordDTO editUserPasswordDTO) {
+        User user = userRepository.findById(userId).orElseThrow(() -> new UserIdNotFoundException(userId));
+
+        if (!passwordEncoder.matches(editUserPasswordDTO.currentPassword(), user.getPassword())) {
+            throw new IllegalArgumentException("Current password is incorrect");
         }
-        if (createUserDTO.lastName() != null) {
-            user.setLastName(createUserDTO.lastName());
-        }
-        if (createUserDTO.email() != null) {
-            user.setEmail(createUserDTO.email());
-        }
-        if (createUserDTO.password() != null && !createUserDTO.password().isEmpty()) {
-            user.setPassword(passwordEncoder.encode(createUserDTO.password()));
-        }
-        if (createUserDTO.phoneNumber() != null) {
-            user.setPhoneNumber(createUserDTO.phoneNumber());
-        }
+
+        user.setPassword(passwordEncoder.encode(editUserPasswordDTO.newPassword()));
+        userRepository.save(user);
+
+        return "Password updated successfully!";
+    }
+
+    @Override
+    public DisplayUserDTO editUser(Long userId, EditUserProfileDTO editUserProfileDTO) {
+        User user = userRepository.findById(userId).orElseThrow(() -> new UserIdNotFoundException(userId));
+
+        user.setFirstName(editUserProfileDTO.firstName());
+        user.setLastName(editUserProfileDTO.lastName());
+        user.setPhoneNumber(editUserProfileDTO.phoneNumber());
+        userRepository.save(user);
+
+        return DisplayUserDTO.fromUser(user);
     }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/UserService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/UserService.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/UserService.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -1,5 +1,5 @@
 package mk.ukim.finki.it.reservengo.service.intf;
 
-import mk.ukim.finki.it.reservengo.dto.userDTO.CreateUserDTO;
+import mk.ukim.finki.it.reservengo.dto.userDTO.*;
 import mk.ukim.finki.it.reservengo.model.domain.User;
 
@@ -7,8 +7,12 @@
     User getUserById(Long userId);
 
-    User editUserProfile(Long userId, CreateUserDTO createUserDTO);
+    DisplayUserDTO editUser(Long userId, EditUserProfileDTO editUserProfileDTO);
 
     User getUserByEmail(String email);
 
     boolean emailExists(String email);
+
+    DisplayUserEmailDTO changeEmail(Long userId, EditUserEmailDTO editUserEmailDTO);
+
+    String changePassword(Long userId, EditUserPasswordDTO editUserPasswordDTO);
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -24,5 +24,10 @@
     @ExceptionHandler(AuthenticationException.class)
     public ResponseEntity<String> handleAuthenticationError(AuthenticationException ex) {
-        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage());
+    }
+
+    @ExceptionHandler(IllegalArgumentException.class)
+    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
+        return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(ex.getMessage());
     }
 
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/AdminController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/AdminController.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/AdminController.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -3,4 +3,5 @@
 import mk.ukim.finki.it.reservengo.dto.localDTO.CreateLocalDTO;
 import mk.ukim.finki.it.reservengo.service.intf.AdminService;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -21,5 +22,5 @@
     public ResponseEntity<?> addLocal(@RequestBody CreateLocalDTO localDTO) {
         adminService.addLocal(localDTO);
-        return ResponseEntity.ok().build();
+        return new ResponseEntity<>(HttpStatus.OK);
     }
 
@@ -27,5 +28,5 @@
     public ResponseEntity<?> deleteLocal(@PathVariable Long id) {
         adminService.deleteLocal(id);
-        return ResponseEntity.ok().build();
+        return new ResponseEntity<>(HttpStatus.OK);
     }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -6,4 +6,5 @@
 import mk.ukim.finki.it.reservengo.service.intf.CustomerService;
 import mk.ukim.finki.it.reservengo.service.intf.ReservationService;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -29,5 +30,5 @@
     public ResponseEntity<?> getCustomerReservations(@AuthenticationPrincipal User user) {
         List<Reservation> customerReservations = reservationService.getCustomerReservations(user.getId());
-        return ResponseEntity.ok(customerReservations);
+        return new ResponseEntity<>(customerReservations, HttpStatus.OK);
     }
 
@@ -35,5 +36,5 @@
     public ResponseEntity<?> listFavouriteLocals(@AuthenticationPrincipal User user) {
         List<Local> favouriteLocals = customerService.listFavouriteLocals(user.getId());
-        return ResponseEntity.ok(favouriteLocals);
+        return new ResponseEntity<>(favouriteLocals, HttpStatus.OK);
     }
 
@@ -41,5 +42,5 @@
     public ResponseEntity<?> addFavouriteLocal(@AuthenticationPrincipal User user, @PathVariable Long id) {
         customerService.addFavouriteLocal(user.getId(), id);
-        return ResponseEntity.ok().build();
+        return new ResponseEntity<>(HttpStatus.OK);
     }
 
@@ -47,5 +48,5 @@
     public ResponseEntity<?> removeFavouriteLocal(@AuthenticationPrincipal User user, @PathVariable Long id) {
         customerService.removeFavouriteLocal(user.getId(), id);
-        return ResponseEntity.ok().build();
+        return new ResponseEntity<>(HttpStatus.OK);
     }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/LocalController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/LocalController.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/LocalController.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -3,4 +3,5 @@
 import mk.ukim.finki.it.reservengo.model.domain.Local;
 import mk.ukim.finki.it.reservengo.service.intf.LocalService;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
@@ -18,5 +19,5 @@
     @GetMapping
     public ResponseEntity<?> getLocals() {
-        return ResponseEntity.ok(localService.listAll());
+        return new ResponseEntity<>(localService.listAll(), HttpStatus.OK);
     }
 
@@ -24,5 +25,5 @@
     public ResponseEntity<?> getLocalInformation(@PathVariable Long id) {
         Local local = localService.getLocalById(id);
-        return ResponseEntity.ok(local);
+        return new ResponseEntity<>(local, HttpStatus.OK);
     }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/UserController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/UserController.java	(revision fa26ba9d04d2288af43126acd43334da65f8fbec)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/UserController.java	(revision 03910973af079925e54e19113fde58104c101261)
@@ -1,7 +1,8 @@
 package mk.ukim.finki.it.reservengo.web.controller;
 
-import mk.ukim.finki.it.reservengo.dto.userDTO.CreateUserDTO;
+import mk.ukim.finki.it.reservengo.dto.userDTO.*;
 import mk.ukim.finki.it.reservengo.model.domain.User;
 import mk.ukim.finki.it.reservengo.service.intf.UserService;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -20,12 +21,22 @@
 
     @GetMapping("/profile")
-    public ResponseEntity<?> getProfile(@AuthenticationPrincipal User user) {
-        User u = userService.getUserById(user.getId());
-        return ResponseEntity.ok(u);
+    public ResponseEntity<DisplayUserDTO> getProfile(@AuthenticationPrincipal User user) {
+        DisplayUserDTO displayUserDTO = DisplayUserDTO.fromUser(userService.getUserById(user.getId()));
+        return new ResponseEntity<>(displayUserDTO, HttpStatus.OK);
     }
 
     @PutMapping("/edit")
-    public ResponseEntity<?> editProfile(@AuthenticationPrincipal User user, @RequestBody CreateUserDTO createUserDTO) {
-        return ResponseEntity.ok(userService.editUserProfile(user.getId(), createUserDTO));
+    public ResponseEntity<DisplayUserDTO> editProfile(@AuthenticationPrincipal User user, @RequestBody EditUserProfileDTO editUserProfileDTO) {
+        return new ResponseEntity<>(userService.editUser(user.getId(), editUserProfileDTO), HttpStatus.OK);
+    }
+
+    @PatchMapping("/change-email")
+    public ResponseEntity<DisplayUserEmailDTO> changeEmail(@AuthenticationPrincipal User user, @RequestBody EditUserEmailDTO editUserEmailDTO) {
+        return new ResponseEntity<>(userService.changeEmail(user.getId(), editUserEmailDTO), HttpStatus.OK);
+    }
+
+    @PatchMapping("/change-password")
+    public ResponseEntity<String> changePassword(@AuthenticationPrincipal User user, @RequestBody EditUserPasswordDTO editUserPasswordDTO) {
+        return new ResponseEntity<>(userService.changePassword(user.getId(), editUserPasswordDTO), HttpStatus.OK);
     }
 }
