Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class EmailAlreadyExistsException extends RuntimeException {
+    public EmailAlreadyExistsException(String email) {
+        super("User with the email " + email + " already exists.");
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class InvalidArgumentsException extends RuntimeException {
+
+    public InvalidArgumentsException() {
+        super("Invalid argument.");
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class InvalidUserCredentialsException extends RuntimeException {
+
+    public InvalidUserCredentialsException() {
+        super("Invalid user credentials");
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,4 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class InvalidUsernameOrPasswordException extends RuntimeException {
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class PasswordsDoNotMatchException extends RuntimeException {
+    public PasswordsDoNotMatchException() {
+        super("The two passwords do not match.");
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(HttpStatus.NOT_FOUND)
+public class UserNotFoundException extends RuntimeException {
+
+    public UserNotFoundException(String username) {
+        super(String.format("User with username: %s was not found", username));
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class UsernameAlreadyExistsException extends RuntimeException {
+    public UsernameAlreadyExistsException(String username) {
+        super("User with the username " + username + " already exists.");
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.User;
+import mk.ukim.finki.db.distributorapp.users.UserRepository;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@RequiredArgsConstructor
+public class CustomUserDetailsService implements UserDetailsService {
+
+    private final UserRepository userRepository;
+
+    @Override
+    @Transactional
+    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
+        return new User(this.userRepository.findUsersByUserEmailIgnoreCaseDto(email));
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,39 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class CustomUsernamePasswordAuthenticationProvider implements AuthenticationProvider {
+    private final UserService userService;
+    private final CustomUserDetailsService customUserDetailsService;
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        String email = authentication.getName();
+        String password = authentication.getCredentials().toString();
+
+        if ("".equals(email) || "".equals(password)) {
+            throw new BadCredentialsException("Invalid email or password");
+        }
+
+        UserDetails userDetails = this.customUserDetailsService.loadUserByUsername(email);
+        String salt = this.userService.findFullUserDtoByEmail(email).getUserSalt();
+        if (!PassEncryption.verifyUserPassword(password, userDetails.getPassword(), salt))
+            throw new BadCredentialsException("Invalid password");
+        return new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
+    }
+
+    @Override
+    public boolean supports(Class<?> aClass) {
+        return aClass.equals(UsernamePasswordAuthenticationToken.class);
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,22 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+@Service("emailService")
+public class EmailService {
+    private final JavaMailSender javaMailSender;
+
+    @Autowired
+    public EmailService(JavaMailSender javaMailSender) {
+        this.javaMailSender = javaMailSender;
+    }
+
+    @Async
+    public void sendEmail(SimpleMailMessage message) {
+        javaMailSender.send(message);
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,58 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.stereotype.Component;
+
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Random;
+
+@Component
+public class PassEncryption {
+    private static final Random random = new SecureRandom();
+    private static final String characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+    private static final int iterations = 20000;
+    private static final int keyLength = 256;
+
+    public static String genSaltValue(int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            sb.append(characters.charAt(random.nextInt(characters.length())));
+        }
+
+        return new String(sb);
+    }
+
+    public static byte[] hash(char[] password, byte[] salt) {
+        PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
+        Arrays.fill(password, Character.MIN_VALUE);
+        try {
+            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
+            return skf.generateSecret(spec).getEncoded();
+        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
+            throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
+        } finally {
+            spec.clearPassword();
+        }
+    }
+
+    public static String generateSecurePassword(String password, String salt) {
+        String res;
+        byte[] securePassword = hash(password.toCharArray(), salt.getBytes());
+
+        res = Base64.getEncoder().encodeToString(securePassword);
+        return res;
+    }
+
+    public static boolean verifyUserPassword(String providedPassword, String securedPassword, String salt) {
+        boolean res;
+        String newSecuredPassword = generateSecurePassword(providedPassword, salt);
+        res = newSecuredPassword.equals(securedPassword);
+
+        return res;
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,30 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+import static mk.ukim.finki.db.distributorapp._security.PassEncryption.generateSecurePassword;
+import static mk.ukim.finki.db.distributorapp._security.PassEncryption.verifyUserPassword;
+
+@Component
+public class PassEncryptionPasswordEncoder implements PasswordEncoder {
+
+    @Override
+    public String encode(CharSequence rawPassword) {
+        throw new UnsupportedOperationException("Salt must be provided explicitly!");
+    }
+
+    public String encodeWithSalt(CharSequence rawPassword, String salt) {
+        return generateSecurePassword(rawPassword.toString(), salt);
+    }
+
+    @Override
+    public boolean matches(CharSequence rawPassword, String encodedPassword) {
+        throw new UnsupportedOperationException("Use matchesWithSalt for explicit salt verification!");
+    }
+
+    public boolean matchesWithSalt(CharSequence rawPassword, String encodedPassword, String salt) {
+        return verifyUserPassword(rawPassword.toString(), encodedPassword, salt);
+    }
+}
+
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,91 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
+import org.springframework.security.web.SecurityFilterChain;
+
+@Configuration
+@EnableWebSecurity
+@RequiredArgsConstructor
+public class SecurityConfig {
+
+    private final CustomUsernamePasswordAuthenticationProvider authenticationProvider;
+    private final SuperUserAuthenticationProvider superUserAuthenticationProvider;
+
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        http
+                .authorizeHttpRequests(auth -> auth
+                        .requestMatchers("/auth/**", "/rest/auth/**", "/reset-password/**", "/css/**", "/js/**").permitAll()
+                        .requestMatchers("/admin/**").hasRole("ADMIN")
+                        .requestMatchers("/customer/**").hasAnyRole("CUSTOMER", "ADMIN")
+                        .requestMatchers("/manager/**").hasAnyRole("MANAGER", "ADMIN")
+                        .requestMatchers("/driver/**").hasAnyRole("DRIVER", "ADMIN")
+                        .anyRequest()
+                        .authenticated()
+                )
+                .formLogin(login -> login
+                        .loginPage("/auth/login")
+                        .loginProcessingUrl("/auth/login")
+                        .usernameParameter("email")
+                        .passwordParameter("password")
+                        .defaultSuccessUrl("/home", true)
+                        .failureUrl("/auth/login?error=true")
+                        .permitAll()
+                )
+                .logout(logout -> logout
+                        .logoutUrl("/logout")
+                        .logoutSuccessUrl("/login?logout")
+                        .clearAuthentication(true)
+                        .invalidateHttpSession(true)
+                        .deleteCookies("JSESSIONID")
+                        .logoutSuccessUrl("/")
+                        .permitAll()
+                )
+                .exceptionHandling((ex) -> ex
+                        .accessDeniedPage("/access-denied"))
+                .csrf(AbstractHttpConfigurer::disable);
+
+        return http.build();
+    }
+
+    @Bean
+    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
+        PasswordEncoder standardEncoder = new BCryptPasswordEncoder();
+        UserDetails superUser = User.withUsername("superuser@admin.com")
+                .password(standardEncoder.encode("supersecret"))
+                .roles("ADMIN")
+                .build();
+        return new InMemoryUserDetailsManager(superUser);
+    }
+
+    @Bean
+    public AuthenticationManager authenticationManager(
+            HttpSecurity http
+    ) throws Exception {
+        AuthenticationManagerBuilder authenticationManagerBuilder =
+                http.getSharedObject(AuthenticationManagerBuilder.class);
+
+        authenticationManagerBuilder.authenticationProvider(superUserAuthenticationProvider);
+        authenticationManagerBuilder.authenticationProvider(authenticationProvider);
+
+        return authenticationManagerBuilder.build();
+    }
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new PassEncryptionPasswordEncoder();
+    }
+
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,46 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SuperUserAuthenticationProvider implements AuthenticationProvider {
+
+    private static final String SUPERUSER_ENCODED_PASSWORD = "$2a$12$KC9Z0kHyu06iV4xlpKOgL.p2KH3NS9EY/N3g97nGAtC/NCpRXVgXa";
+
+    private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        String username = authentication.getName();
+        String rawPassword = authentication.getCredentials().toString();
+
+        if (!"superuser@admin.com".equalsIgnoreCase(username)) {
+            return null;
+        }
+
+        if (!passwordEncoder.matches(rawPassword, SUPERUSER_ENCODED_PASSWORD)) {
+            throw new BadCredentialsException("Invalid superuser credentials");
+        }
+
+        UserDetails superUser = User.withUsername("superuser@admin.com")
+                .password(SUPERUSER_ENCODED_PASSWORD)
+                .roles("ADMIN")
+                .build();
+
+        return new UsernamePasswordAuthenticationToken(superUser, superUser.getPassword(), superUser.getAuthorities());
+    }
+
+    @Override
+    public boolean supports(Class<?> authentication) {
+        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,94 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import jakarta.servlet.http.HttpServletRequest;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
+import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
+import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import mk.ukim.finki.db.distributorapp._exceptions.InvalidUserCredentialsException;
+import mk.ukim.finki.db.distributorapp.city.CityService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import java.util.List;
+
+
+@Controller
+@RequestMapping("/auth")
+public class AuthController {
+
+    private final CityService cityService;
+    private final AuthService authService;
+
+    public AuthController(CityService cityService, AuthService authService) {
+        this.cityService = cityService;
+        this.authService = authService;
+    }
+
+    @GetMapping("/login")
+    public String login(@RequestParam(value = "error", required = false) String error, Model model) {
+        if (error != null) {
+            model.addAttribute("error", "Invalid username or password");
+        }
+        return "authentication/login";
+    }
+
+    @PostMapping("/login")
+    public String login(@ModelAttribute LoginRequestDto loginRequest, RedirectAttributes redirectAttributes) {
+        try {
+            UsersLoadingDto user = authService.login(loginRequest);
+
+            switch (user.getUserRole()) {
+                case "ROLE_CUSTOMER" -> {
+                    return "redirect:/home/customer";
+                }
+                case "ROLE_ADMIN" -> {
+                    return "redirect:/home/admin";
+                }
+                case "ROLE_MANAGER" -> {
+                    return "redirect:/home/manager";
+                }
+                case "ROLE_DRIVER" -> {
+                    return "redirect:/home/driver";
+                }
+                default -> {
+                    return "redirect:/home";
+                }
+            }
+        } catch (InvalidUserCredentialsException e) {
+            redirectAttributes.addFlashAttribute("error", "Invalid credentials.");
+            return "redirect:/auth/login";
+        }
+    }
+
+    @GetMapping("/register")
+    public String registerCustomer(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("cities", cities);
+        return "authentication/register";
+    }
+
+    @PostMapping("/register")
+    public String register(@ModelAttribute RegisterRequestDto registerRequest) throws Exception {
+        authService.register(registerRequest);
+        return "redirect:/auth/login";
+    }
+
+    @GetMapping("/changePass")
+    public String changePassword(Model model) {
+        return "authentication/changePass";
+    }
+
+    @GetMapping("/logout")
+    public String logout(HttpServletRequest req) {
+        req.getSession().invalidate();
+        return "redirect:/auth/login";
+    }
+
+    @PostMapping("/logout")
+    public String logout(Model model) {
+        return "redirect:/auth/login";
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
+import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
+import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
+import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+
+public interface AuthService {
+    void register(RegisterRequestDto registerRequest) throws Exception;
+
+    void createManager(CreateManagerDto createUserDto) throws Exception;
+
+    void createDriver(CreateDriverDto createDriverDto) throws Exception;
+
+    UsersLoadingDto login(LoginRequestDto loginRequest);
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,173 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.customer.CustomerRepository;
+import mk.ukim.finki.db.distributorapp.driver.DriverRepository;
+import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
+import mk.ukim.finki.db.distributorapp.manager.ManagerRepository;
+import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
+import mk.ukim.finki.db.distributorapp.token.TokenRepository;
+import mk.ukim.finki.db.distributorapp.users.Role;
+import mk.ukim.finki.db.distributorapp.token.TokenType;
+import mk.ukim.finki.db.distributorapp._exceptions.InvalidArgumentsException;
+import mk.ukim.finki.db.distributorapp._exceptions.InvalidUserCredentialsException;
+import mk.ukim.finki.db.distributorapp._security.EmailService;
+import mk.ukim.finki.db.distributorapp._security.PassEncryption;
+import mk.ukim.finki.db.distributorapp._security.PassEncryptionPasswordEncoder;
+import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
+import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
+import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
+import mk.ukim.finki.db.distributorapp.users.UserRepository;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class AuthServiceImpl implements AuthService {
+
+    private final UserRepository userRepository;
+    private final TokenRepository tokenRepository;
+    private final EmailService emailService;
+    private final PassEncryptionPasswordEncoder passwordEncoder;
+    private final CustomerRepository customerRepository;
+    private final ManagerRepository managerRepository;
+    private final DriverRepository driverRepository;
+
+    @Override
+    @Transactional
+    public void register(RegisterRequestDto registerRequest) throws Exception {
+        String saltValue = PassEncryption.genSaltValue(30);
+        String safePass = passwordEncoder.encodeWithSalt(registerRequest.getPassword(), saltValue);
+
+        Integer res = this.userRepository.create(
+                registerRequest.getName(),
+                registerRequest.getSurname(),
+                safePass,
+                registerRequest.getEmail(),
+                registerRequest.getMobile(),
+                saltValue,
+                false,
+                null,
+                registerRequest.getCity(),
+                Role.ROLE_CUSTOMER.name(),
+                "CUSTOMER");
+        if (res == 0) {
+            throw new Exception("User insertion failed");
+        }
+
+        UserDto user = this.userRepository.findUserDtoByEmail(registerRequest.getEmail());
+        String t_value = UUID.randomUUID().toString();
+        tokenRepository.create(
+                t_value,
+                LocalDateTime.now().plusHours(1),
+                user.getId(),
+                TokenType.TOKEN_VERIFICATION.name()
+        );
+
+        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
+
+        SimpleMailMessage mailMessage = new SimpleMailMessage();
+        mailMessage.setTo(registerRequest.getEmail());
+        mailMessage.setSubject("Complete Registration!");
+        mailMessage.setText(("To confirm your account, please click here: " +
+                "https://localhost:8080/register/confirm-account?token=" + createdToken.getT_value()));
+        System.out.println("Confirmation Token: " + createdToken.getT_value());
+        emailService.sendEmail(mailMessage);
+
+        this.customerRepository.create(
+                user.getId(),
+                registerRequest.getEdb(),
+                registerRequest.getName(),
+                registerRequest.getAddress(),
+                registerRequest.getProfileImage());
+    }
+
+    @Override
+    @Transactional
+    public void createManager(CreateManagerDto createManagerDto) throws Exception {
+        String saltValue = PassEncryption.genSaltValue(30);
+        String safePass = passwordEncoder.encodeWithSalt(createManagerDto.getPassword(), saltValue);
+
+        Integer res = this.userRepository.create(
+                createManagerDto.getName(),
+                createManagerDto.getSurname(),
+                safePass,
+                createManagerDto.getEmail(),
+                createManagerDto.getMobile(),
+                saltValue,
+                false,
+                null,
+                createManagerDto.getCity(),
+                Role.ROLE_MANAGER.name(),
+                "MANAGER");
+
+        if (res == 0) {
+            throw new Exception("User insertion failed");
+        }
+
+        UserDto user = this.userRepository.findUserDtoByEmail(createManagerDto.getEmail());
+        this.managerRepository.create(
+                user.getId(),
+                createManagerDto.getWarehouseId()
+        );
+    }
+
+    @Override
+    @Transactional
+    public void createDriver(CreateDriverDto createDriverDto) throws Exception {
+        String saltValue = PassEncryption.genSaltValue(30);
+        String safePass = passwordEncoder.encodeWithSalt(createDriverDto.getPassword(), saltValue);
+
+        Integer res = this.userRepository.create(
+                createDriverDto.getName(),
+                createDriverDto.getSurname(),
+                safePass,
+                createDriverDto.getEmail(),
+                createDriverDto.getMobile(),
+                saltValue,
+                false,
+                null,
+                createDriverDto.getCity(),
+                Role.ROLE_DRIVER.name(),
+                "DRIVER");
+
+        if (res == 0) {
+            throw new Exception("User insertion failed");
+        }
+
+        UserDto user = this.userRepository.findUserDtoByEmail(createDriverDto.getEmail());
+        this.driverRepository.create(
+                user.getId(),
+                createDriverDto.getVehicle()
+        );
+    }
+
+    @Override
+    @Transactional
+    public UsersLoadingDto login(LoginRequestDto loginRequest) {
+        if (loginRequest.getEmail() == null
+                || loginRequest.getEmail().isEmpty()
+                || loginRequest.getPassword() == null
+                || loginRequest.getPassword().isEmpty()) {
+
+            throw new InvalidArgumentsException();
+        }
+
+        UsersLoadingDto user = this.userRepository.findUsersByUserEmailIgnoreCaseDto(loginRequest.getEmail());
+
+        String secPassword = passwordEncoder
+                .encodeWithSalt(loginRequest.getPassword(), user.getUserSalt());
+
+        if (!secPassword.equals(user.getUserPassword())) {
+            throw new InvalidUserCredentialsException();
+        }
+
+        return user;
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,121 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import mk.ukim.finki.db.distributorapp.token.TokenType;
+import mk.ukim.finki.db.distributorapp.token.TokenRepository;
+import mk.ukim.finki.db.distributorapp._security.EmailService;
+import mk.ukim.finki.db.distributorapp._security.PassEncryptionPasswordEncoder;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/reset-password")
+public class PasswordResetController {
+    private final UserService userService;
+    private final EmailService emailService;
+    private final PassEncryptionPasswordEncoder passwordEncoder;
+    private final TokenRepository tokenRepository;
+
+
+    @GetMapping("/request")
+    public String resetPasswordRequest() {
+        return "authentication/reset-password-request";
+    }
+
+    @PostMapping("/reset-password-request")
+    public String resetPasswordRequest(@RequestParam("email") String email, Model model) {
+
+        UsersLoadingDto user = this.userService.findFullUserDtoByEmail(email);
+        if (user == null) {
+            model.addAttribute("error", "No user found with this email.");
+            return "authentication/reset-password-request";
+        }
+
+        String t_value = UUID.randomUUID().toString();
+        tokenRepository.create(
+                t_value,
+                LocalDateTime.now().plusHours(1),
+                user.getUserId(),
+                TokenType.TOKEN_RESET.name()
+        );
+        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
+
+        UserDto dto = this.userService.findUserDtoByEmail(email);
+        this.userService.edit(dto);
+
+        String resetLink = "https://localhost:8080/reset-password?token=" + createdToken.getT_value();
+        String emailBody = "Click the link to reset your password: " + resetLink;
+
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setTo(email);
+        message.setSubject("Password Reset Request");
+        message.setText(emailBody);
+        emailService.sendEmail(message);
+
+        model.addAttribute("success", "A password link has been sent to your email.");
+        return "authentication/reset-password-request";
+    }
+
+    @GetMapping("/reset-password")
+    public String showResetPasswordForm(@RequestParam("token") String tokenValue, Model model) {
+
+        UsersLoadingDto user = userService.findUserByResetToken(tokenValue);
+        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
+        if (user == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
+            model.addAttribute("error", "Invalid or expired token.");
+            return "authentication/reset-password";
+        }
+        model.addAttribute("token", token);
+        return "authentication/reset-password";
+    }
+
+    @PostMapping("/reset-password")
+    public String handleResetPassword(
+            @RequestParam("token") String tokenValue,
+            @RequestParam("newPassword") String newPassword,
+            @RequestParam("confirmPassword") String confirmPassword,
+            Model model) {
+
+        UsersLoadingDto user = userService.findUserByResetToken(tokenValue);
+        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
+        if (user.getUserId() == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
+            model.addAttribute("error", "Invalid or expired token.");
+            return "authentication/reset-password";
+        }
+
+        if (!newPassword.equals(confirmPassword)) {
+            model.addAttribute("error", "Passwords do not match.");
+            return "authentication/reset-password";
+        }
+
+        user.setUserPassword(passwordEncoder.encodeWithSalt(newPassword, user.getUserSalt()));
+        token.setT_validated_at(LocalDateTime.now());
+        tokenRepository.edit(
+                token.getT_id(),
+                token.getT_value(),
+                token.getT_expiry(),
+                token.getUser_id(),
+                token.getT_validated_at(),
+                token.getT_type()
+        );
+
+        UserDto dto = this.userService.findUserDtoByEmail(user.getUserEmail());
+        this.userService.edit(dto);
+
+        model.addAttribute("success", "Your password has been reset successfully.");
+        return "authentication/reset-password";
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChangePasswordDto {
+    String email;
+    String oldPassword;
+    String newPassword;
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoginRequestDto {
+    private String email;
+    private String password;
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoginResponseDto {
+    private String token;
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RegisterRequestDto {
+    private String name;
+    private String surname;
+    private String password;
+    private String repeatedPassword;
+    private String email;
+    private String mobile;
+    private String profileImage;
+    private Integer city;
+    private String edb;
+    private String compName;
+    private String address;
+    private String repImage;
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,122 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
+import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
+import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
+import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
+import mk.ukim.finki.db.distributorapp._security.auth.AuthService;
+import mk.ukim.finki.db.distributorapp.city.CityService;
+import mk.ukim.finki.db.distributorapp.driver.DriverService;
+import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/admin")
+public class AdminController {
+
+    private final AuthService authService;
+    private final CityService cityService;
+    private final WarehouseService warehouseService;
+    private final DriverService driverService;
+    private final VehicleService vehicleService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String getDashboard(Model model) {
+        return "home/admin";
+    }
+
+    //    MANAGER CONTROLS:
+
+    @GetMapping("/create-manager")
+    public String createManager(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("cities", cities);
+        model.addAttribute("manager", new CreateManagerDto());
+        return "create-manager";
+    }
+
+    @PostMapping("/create-manager")
+    public String createManager(@ModelAttribute("manager") CreateManagerDto createManagerDto) throws Exception {
+        WarehouseDto wh = this.warehouseService.findByCityId(createManagerDto.getCity());
+        createManagerDto.setWarehouseId(wh.getId());
+        this.authService.createManager(createManagerDto);
+        return "redirect:/manager/all";
+    }
+
+    @GetMapping("/edit-manager")
+    public String editManager() {
+        return "edit-manager";
+    }
+
+    @GetMapping("/warehouse-by-city")
+    @ResponseBody
+    public WarehouseDto getWarehouseByCity(@RequestParam("cityId") Integer cityId) {
+        return this.warehouseService.findByCityId(cityId);
+    }
+
+    //    DRIVER CONTROLS:
+    @GetMapping("/create-driver")
+    public String createDriver(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("cities", cities);
+        model.addAttribute("driver", new CreateDriverDto());
+        return "create-driver";
+    }
+
+    @GetMapping("/vehicle-by-city")
+    @ResponseBody
+    public List<VehicleBasicDto> getVehicleByCity(@RequestParam("cityId") Integer cityId) {
+        WarehouseDto wh = this.warehouseService.findByCityId(cityId);
+        return this.vehicleService.getVehiclesByWarehouse(wh.getId());
+    }
+
+    @PostMapping("/create-driver")
+    public String createDriver(@ModelAttribute("driver") CreateDriverDto createDriverDto, @ModelAttribute("vehicle") VehicleDto vehicleDto) throws Exception {
+        this.authService.createDriver(createDriverDto);
+        return "all-drivers";
+    }
+
+    @GetMapping("/edit-driver/{id}")
+    public String editDriver(@PathVariable("id") Long id, Model model) {
+        DriverDto driver = this.driverService.findById(id);
+        model.addAttribute("driver", driver);
+        return "edit-driver";
+    }
+
+    @PostMapping("/edit-driver/{id}")
+    public String editDriver(@PathVariable("id") Long id, @ModelAttribute("driver") DriverDto driverDto, Model model) {
+        Integer res = this.driverService.edit(driverDto);
+        if (res == 1) {
+            model.addAttribute("edit-success", true);
+        } else {
+            model.addAttribute("edit-success", false);
+        }
+        return "all-drivers";
+    }
+
+    //    WAREHOUSE CONTROLS:
+
+    @GetMapping("/create-warehouse")
+    public String createWarehouse(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("warehouse", new WarehouseDto());
+        model.addAttribute("cities", cities);
+        return "create-warehouse";
+    }
+
+    @PostMapping("/create-warehouse")
+    public String createWarehouse(@ModelAttribute("warehouse") WarehouseDto warehouseDto, Model model) {
+        this.warehouseService.create(warehouseDto);
+        return "redirect:/warehouse";
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,128 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.article.ArticleService;
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnitService;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
+import mk.ukim.finki.db.distributorapp.category.CategoryService;
+import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
+import mk.ukim.finki.db.distributorapp.customer.CustomerService;
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
+import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
+import mk.ukim.finki.db.distributorapp.manufacturer.ManufacturerService;
+import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
+import mk.ukim.finki.db.distributorapp.order.OrdersService;
+import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.*;
+
+import java.security.Principal;
+import java.util.List;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping(value = "/customer")
+public class CustomerController {
+    private final CustomerService customerService;
+    private final UserService userService;
+    private final OrdersService ordersService;
+    private final DeliveryService deliveryService;
+    private final CategoryService categoryService;
+    private final WarehouseService warehouseService;
+    private final ArticleService articleService;
+    private final ArticleUnitService articleUnitService;
+    private final ManufacturerService manufacturerService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String dashboard(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        CustomerDto customer = this.customerService.findCustomerById(user.getId());
+        model.addAttribute("customer", customer);
+        // TODO: fix fetching current orders for customer
+        model.addAttribute("currentOrders", ordersService.findCurrentOrdersByCustomer(customer.getId()));
+        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByCustomer(customer.getId()));
+        return "home/customer";
+    }
+
+    @GetMapping("/create-order")
+    public String createOrder(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        String userEmail = authentication.getName();
+
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        WarehouseDto warehouse = this.warehouseService.findByCityId(user.getCityId());
+
+        List<CategoryDto> categories = this.categoryService.listCategories();
+        List<ArticleDto> articles = this.articleService.getAllArticlesByWarehouse(warehouse.getId());
+        List<ManufacturerDto> manufacturers = this.manufacturerService.getAllManufacturers();
+        List<ArticleUnitDto> articleUnits = this.articleUnitService.getAllArticleUnitsByWarehouse(warehouse.getId());
+
+        model.addAttribute("categories", categories);
+        model.addAttribute("articles", articles);
+        model.addAttribute("manufacturers", manufacturers);
+        model.addAttribute("articleUnits", articleUnits);
+        return "create-order";
+    }
+
+    @InitBinder
+    public void initBinder(WebDataBinder binder) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        binder.registerCustomEditor(List.class, "orderItems", new java.beans.PropertyEditorSupport() {
+            @Override
+            public void setAsText(String text) throws IllegalArgumentException {
+                try {
+                    List<OrderItemDto> items = objectMapper.readValue(
+                            text, new TypeReference<List<OrderItemDto>>() {
+                            }
+                    );
+                    setValue(items);
+                } catch (Exception e) {
+                    throw new IllegalArgumentException("Invalid JSON for order items", e);
+                }
+            }
+        });
+    }
+
+    @PostMapping("/create-order")
+    public String createOrder(@ModelAttribute CreateOrderDto createOrderDto, Principal principal) {
+
+        this.ordersService.create(createOrderDto, principal);
+
+        String userEmail = principal.getName();
+
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        CustomerDto customer = this.customerService.findCustomerById(user.getId());
+
+        List<OrderSimpleDto> simpleCustomerOrders = this.ordersService.findSimpleOrdersByCustomer(customer.getId());
+        OrderSimpleDto createdOrder = simpleCustomerOrders.get(simpleCustomerOrders.size() - 1);
+        WarehouseDto wh = this.warehouseService.findByCityId(user.getCityId());
+
+        List<ArticleUnitSimpleDto> editedUnits = this.articleUnitService.addArticleUnitToOrder(createOrderDto.getOrderItems(), createdOrder.getId(), wh.getId());
+
+        for (ArticleUnitSimpleDto unit : editedUnits) {
+            this.articleUnitService.simpleEdit(unit);
+        }
+
+        return "redirect:/customer/dashboard";
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,53 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.driver.DriverService;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping(value = "/driver")
+public class DriverController {
+    private final DriverService driverService;
+    private final UserService userService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String dashboard(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        model.addAttribute("user", user);
+        model.addAttribute("startDelivery", new DeliveryStartDto());
+        model.addAttribute("endDelivery", new DeliveryEndDto());
+        model.addAttribute("ongoingDeliveries", this.driverService.getOngoingDeliveries(user.getId()));
+        model.addAttribute("newDeliveries", this.driverService.getNewAssignedDeliveries(user.getId()));
+        model.addAttribute("finishedDeliveries", this.driverService.getFinishedAssignedDeliveries(user.getId()));
+        return "home/driver";
+    }
+
+    @PostMapping("/start-delivery")
+    public String startDelivery(@ModelAttribute("startDelivery") DeliveryStartDto delivery) {
+        this.driverService.startDelivery(delivery);
+        return "redirect:/driver/dashboard";
+    }
+
+    @PostMapping("/end-delivery")
+    public String endDelivery(@ModelAttribute("endDelivery") DeliveryEndDto delivery) {
+        this.driverService.endDelivery(delivery);
+        return "redirect:/driver/dashboard";
+    }
+
+
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,54 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping({"/", "/home"})
+public class HomeController {
+    private final UserService userService;
+
+    @GetMapping
+    public String homePage(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        if (authentication == null || !authentication.isAuthenticated() || authentication.getPrincipal().equals("anonymousUser")) {
+            model.addAttribute("userType", "Guest");
+            return "authentication/login";
+        }
+
+        String userEmail = authentication.getName();
+        if (userEmail.equals("superuser@admin.com")) {
+            return "redirect:/admin/dashboard";
+        }
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        switch (user.getRole()) {
+            case "ROLE_CUSTOMER" -> {
+                return "redirect:/customer/dashboard";
+            }
+            case "ROLE_DRIVER" -> {
+                return "redirect:/driver/dashboard";
+            }
+            case "ROLE_MANAGER" -> {
+                return "redirect:/manager/dashboard";
+            }
+        }
+        model.addAttribute("userType", "Guest");
+        return "authentication/login";
+    }
+
+    @GetMapping("/access_denied")
+    public String getAccessDeniedPage(Model model) {
+        model.addAttribute("error", "access_denied");
+        return "authentication/access_denied";
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,81 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+import mk.ukim.finki.db.distributorapp.order.OrdersService;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+@Controller
+@RequestMapping(value = "/manager")
+@RequiredArgsConstructor
+public class ManagerController {
+    private final UserService userService;
+    private final VehicleService vehicleService;
+    private final OrdersService ordersService;
+    private final WarehouseService warehouseService;
+    private final DeliveryService deliveryService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String dashboard(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        model.addAttribute("user", user);
+        model.addAttribute("currentInventory", warehouseService.getInventoryByManager(user.getId()));
+        model.addAttribute("vehicleStatus", vehicleService.getVehiclesByManager(user.getId()));
+        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
+        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByManager(user.getId()));
+        return "home/manager";
+    }
+
+    @GetMapping("/all")
+    public String allManagers(Model model) {
+        return "all-managers";
+    }
+
+    @GetMapping("/create-delivery")
+    public String createDelivery(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        model.addAttribute("user", user);
+        model.addAttribute("newDelivery", new DeliveryCreateDto());
+        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
+        model.addAttribute("vehicles", vehicleService.getVehiclesByManager(user.getId()));
+
+        return "create-delivery";
+    }
+
+    @PostMapping("/create-delivery")
+    public String createDelivery(@ModelAttribute DeliveryCreateDto newDelivery) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        this.deliveryService.create(newDelivery);
+
+        List<DeliverySimpleDto> deliveries = this.deliveryService.getDeliveriesByVehicle(newDelivery.getVehId());
+        DeliverySimpleDto createdDelivery = deliveries.get(0);
+
+        this.ordersService.addOrdersToDelivery(newDelivery.getOrders(), createdDelivery.getDeliveryId());
+
+        return "redirect:/manager/dashboard";
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/WarehouseController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/WarehouseController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/WarehouseController.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping(value = "/warehouse")
+public class WarehouseController {
+    @GetMapping("/create")
+    public String createWarehouse() {
+        return "create-warehouse";
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -6,5 +6,4 @@
 import jakarta.validation.constraints.Size;
 import lombok.Data;
-import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
 import mk.ukim.finki.db.distributorapp.category.Category;
 import mk.ukim.finki.db.distributorapp.manufacturer.Manufacturer;
@@ -48,6 +47,3 @@
     @OneToMany(mappedBy = "article")
     private List<Price> prices;
-
-    @OneToMany(mappedBy = "article")
-    private List<ArticleUnit> articleUnits;
 }
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -5,5 +5,4 @@
 import jakarta.validation.constraints.Size;
 import lombok.Data;
-import mk.ukim.finki.db.distributorapp.article.Article;
 import mk.ukim.finki.db.distributorapp.order.Orders;
 import mk.ukim.finki.db.distributorapp.price.Price;
@@ -21,4 +20,5 @@
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "unit_id")
     private Long unitId;
 
@@ -47,9 +47,4 @@
     @NotNull
     @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "art_id", nullable = false)
-    private Article article;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
     @JoinColumn(name = "wh_id", nullable = false)
     private Warehouse warehouse;
@@ -66,3 +61,4 @@
     )
     private Set<Price> prices = new LinkedHashSet<>();
+    // Hm...? Set<Price> or List<Price>
 }
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -25,16 +25,16 @@
             value = """
                     select au.unit_id as id,
-                    au.unit_expiration_date as expiryDate,
-                    au.unit_serial_number as serialNo,
-                    au.unit_batch_number as batchNo,
-                    au.unit_manufacture_date as manufactureDate,
-                    au.unit_cost_price as costPrice,
-                    a.art_id as artId,
-                    a.art_name as artName,
-                    au.wh_id as whId,
-                    r.region_name as whRegion,
-                    c.city_name as whCity,
-                    au.ord_id as ordId,
-                    u.user_email as customerEmail
+                            au.unit_expiration_date as expiryDate,
+                            au.unit_serial_number as serialNo,
+                            au.unit_batch_number as batchNo,
+                            au.unit_manufacture_date as manufactureDate,
+                            au.unit_cost_price as costPrice,
+                            a.art_id as artId,
+                            a.art_name as artName,
+                            au.wh_id as whId,
+                            r.region_name as whRegion,
+                            c.city_name as whCity,
+                            au.ord_id as ordId,
+                            u.user_email as customerEmail
                     from article_unit au
                     join warehouse wh on au.wh_id = wh.wh_id
@@ -72,7 +72,9 @@
     @Query(
             nativeQuery = true,
-            value = "update article_unit " +
-                    "set unit_expiration_date = ?2, unit_serial_number = ?3, unit_batch_number = ?4,unit_manufacture_date = ?5,unit_cost_price = ?6,wh_id = ?7,ord_id = ?8 " +
-                    "where unit_id=?1"
+            value = """
+                    update article_unit
+                    set unit_expiration_date = ?2, unit_serial_number = ?3, unit_batch_number = ?4,unit_manufacture_date = ?5,unit_cost_price = ?6,wh_id = ?7,ord_id = ?8
+                    where unit_id=?1
+                    """
     )
     Integer edit(
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/city/City.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/city/City.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/city/City.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -6,5 +6,5 @@
 import lombok.Data;
 import mk.ukim.finki.db.distributorapp.region.Region;
-import mk.ukim.finki.db.distributorapp.users.Users;
+import mk.ukim.finki.db.distributorapp.users.User;
 import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
 
@@ -26,5 +26,5 @@
 
     @OneToMany(mappedBy = "city")
-    private List<Users> users;
+    private List<User> users;
 
     @OneToOne(mappedBy = "city")
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -8,5 +8,5 @@
 import mk.ukim.finki.db.distributorapp.customerWeekday.CustomerWeekday;
 import mk.ukim.finki.db.distributorapp.order.Orders;
-import mk.ukim.finki.db.distributorapp.users.Users;
+import mk.ukim.finki.db.distributorapp.users.User;
 
 import java.util.List;
@@ -18,5 +18,5 @@
 @DiscriminatorValue("CUSTOMER")
 @PrimaryKeyJoinColumn(name = "user_id")
-public class Customer extends Users {
+public class Customer extends User {
     @Size(max = 13)
     @NotNull
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -21,6 +21,8 @@
     @Query(
             nativeQuery = true,
-            value = "insert into delivery(del_date_created, del_date, del_start_km, del_end_km, del_start_time, del_end_time, d_status_id, veh_id) " +
-                    "values (?1,?2,?3,?4,?5,?6,?7,?8)"
+            value = """
+                    insert into delivery(del_date_created, del_date, del_start_km, del_end_km, del_start_time, del_end_time, d_status_id, veh_id)
+                    values (?1,?2,?3,?4,?5,?6,?7,?8)
+                    """
     )
     Integer create(
@@ -39,7 +41,9 @@
     @Query(
             nativeQuery = true,
-            value = "update delivery " +
-                    "set del_date_created = ?2,del_date = ?3,del_start_km = ?4,del_end_km = ?5,del_start_time = ?6,del_end_time = ?7,d_status_id = ?8,veh_id = ?9 " +
-                    "where del_id = ?1"
+            value = """
+                    update delivery
+                    set del_date_created = ?2,del_date = ?3,del_start_km = ?4,del_end_km = ?5,del_start_time = ?6,del_end_time = ?7,d_status_id = ?8,veh_id = ?9
+                    where del_id = ?1
+                    """
     )
     Integer edit(
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -5,5 +5,5 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import mk.ukim.finki.db.distributorapp.users.Users;
+import mk.ukim.finki.db.distributorapp.users.User;
 import mk.ukim.finki.db.distributorapp.vehicle.Vehicle;
 
@@ -14,5 +14,5 @@
 @DiscriminatorValue("DRIVER")
 @PrimaryKeyJoinColumn(name = "user_id")
-public class Driver extends Users {
+public class Driver extends User {
     @NotNull
     @OneToOne
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/EmailAlreadyExistsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/EmailAlreadyExistsException.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.exceptions;
-
-public class EmailAlreadyExistsException extends RuntimeException {
-    public EmailAlreadyExistsException(String email) {
-        super("User with the email " + email + " already exists.");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/InvalidArgumentsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/InvalidArgumentsException.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package mk.ukim.finki.db.distributorapp.exceptions;
-
-public class InvalidArgumentsException extends RuntimeException {
-
-    public InvalidArgumentsException() {
-        super("Invalid argument.");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/InvalidUserCredentialsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/InvalidUserCredentialsException.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package mk.ukim.finki.db.distributorapp.exceptions;
-
-public class InvalidUserCredentialsException extends RuntimeException {
-
-    public InvalidUserCredentialsException() {
-        super("Invalid user credentials");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/InvalidUsernameOrPasswordException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/InvalidUsernameOrPasswordException.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.db.distributorapp.exceptions;
-
-public class InvalidUsernameOrPasswordException extends RuntimeException {
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/PasswordsDoNotMatchException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/PasswordsDoNotMatchException.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.exceptions;
-
-public class PasswordsDoNotMatchException extends RuntimeException {
-    public PasswordsDoNotMatchException() {
-        super("The two passwords do not match.");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/UserNotFoundException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/UserNotFoundException.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.exceptions;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ResponseStatus;
-
-@ResponseStatus(HttpStatus.NOT_FOUND)
-public class UserNotFoundException extends RuntimeException {
-
-    public UserNotFoundException(String username) {
-        super(String.format("User with username: %s was not found", username));
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/UsernameAlreadyExistsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/exceptions/UsernameAlreadyExistsException.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp.exceptions;
-
-public class UsernameAlreadyExistsException extends RuntimeException {
-    public UsernameAlreadyExistsException(String username) {
-        super("User with the username " + username + " already exists.");
-    }
-}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -5,5 +5,5 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import mk.ukim.finki.db.distributorapp.users.Users;
+import mk.ukim.finki.db.distributorapp.users.User;
 import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
 
@@ -14,5 +14,5 @@
 @DiscriminatorValue("MANAGER")
 @PrimaryKeyJoinColumn(name = "user_id")
-public class Manager extends Users {
+public class Manager extends User {
     @NotNull
     @OneToOne
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -115,6 +115,8 @@
     @Query(
             nativeQuery = true,
-            value = "insert into orders (ord_date, ord_sum, ord_fulfillment_date, ord_comment, o_status_id, cust_id, del_id, pf_id) " +
-                    "values (?1,?2,?3,?4,?5,?6,?7,?8)"
+            value = """
+                    insert into orders (ord_date, ord_sum, ord_fulfillment_date, ord_comment, o_status_id, cust_id, del_id, pf_id)
+                    values (?1,?2,?3,?4,?5,?6,?7,?8)
+                    """
     )
     Integer create(
@@ -133,7 +135,9 @@
     @Query(
             nativeQuery = true,
-            value = "update orders " +
-                    "set ord_date=?2,ord_sum=?3,ord_fulfillment_date=?4,ord_comment=?5,o_status_id=?6,cust_id=?7,del_id=?8,pf_id=?9 " +
-                    "where ord_id=?1"
+            value = """
+                    update orders
+                    set ord_date=?2,ord_sum=?3,ord_fulfillment_date=?4,ord_comment=?5,o_status_id=?6,cust_id=?7,del_id=?8,pf_id=?9
+                    where ord_id=?1
+                    """
     )
     Integer edit(
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -10,5 +10,5 @@
 import mk.ukim.finki.db.distributorapp.customer.CustomerService;
 import mk.ukim.finki.db.distributorapp.proForma.ProFormaService;
-import mk.ukim.finki.db.distributorapp.users.UsersService;
+import mk.ukim.finki.db.distributorapp.users.UserService;
 import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
 import org.springframework.stereotype.Service;
@@ -24,5 +24,5 @@
 public class OrdersServiceImpl implements OrdersService {
     private final OrdersRepository ordersRepository;
-    private final UsersService usersService;
+    private final UserService userService;
     private final CustomerService customerService;
     private final ProFormaService proFormaService;
@@ -42,5 +42,5 @@
     public Integer create(CreateOrderDto createOrderDto, Principal principal) {
         String userEmail = principal.getName();
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
         CustomerDto customer = this.customerService.findCustomerById(user.getId());
 
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -38,6 +38,8 @@
     @Query(
             nativeQuery = true,
-            value = "insert into pro_forma(pf_deadline, pf_date_created, pf_status_id) " +
-                    "values (?1,?2,?3)"
+            value = """
+                    insert into pro_forma(pf_deadline, pf_date_created, pf_status_id)
+                    values (?1,?2,?3)
+                    """
     )
     Integer create(
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/CustomUserDetailsService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/CustomUserDetailsService.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.Users;
-import mk.ukim.finki.db.distributorapp.users.UsersRepository;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-@Service
-@RequiredArgsConstructor
-public class CustomUserDetailsService implements UserDetailsService {
-
-    private final UsersRepository usersRepository;
-
-    @Override
-    @Transactional
-    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
-        return new Users(this.usersRepository.findUsersByUserEmailIgnoreCaseDto(email));
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/CustomUsernamePasswordAuthenticationProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/CustomUsernamePasswordAuthenticationProvider.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,39 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.UsersService;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.stereotype.Component;
-
-@Component
-@RequiredArgsConstructor
-public class CustomUsernamePasswordAuthenticationProvider implements AuthenticationProvider {
-    private final UsersService usersService;
-    private final CustomUserDetailsService customUserDetailsService;
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        String email = authentication.getName();
-        String password = authentication.getCredentials().toString();
-
-        if ("".equals(email) || "".equals(password)) {
-            throw new BadCredentialsException("Invalid email or password");
-        }
-
-        UserDetails userDetails = this.customUserDetailsService.loadUserByUsername(email);
-        String salt = this.usersService.findFullUserDtoByEmail(email).getUserSalt();
-        if (!PassEncryption.verifyUserPassword(password, userDetails.getPassword(), salt))
-            throw new BadCredentialsException("Invalid password");
-        return new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
-    }
-
-    @Override
-    public boolean supports(Class<?> aClass) {
-        return aClass.equals(UsernamePasswordAuthenticationToken.class);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/EmailService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/EmailService.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-
-@Service("emailService")
-public class EmailService {
-    private final JavaMailSender javaMailSender;
-
-    @Autowired
-    public EmailService(JavaMailSender javaMailSender) {
-        this.javaMailSender = javaMailSender;
-    }
-
-    @Async
-    public void sendEmail(SimpleMailMessage message) {
-        javaMailSender.send(message);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryption.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryption.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security;
-
-import org.springframework.stereotype.Component;
-
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.PBEKeySpec;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.spec.InvalidKeySpecException;
-import java.util.Arrays;
-import java.util.Base64;
-import java.util.Random;
-
-@Component
-public class PassEncryption {
-    private static final Random random = new SecureRandom();
-    private static final String characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-    private static final int iterations = 20000;
-    private static final int keyLength = 256;
-
-    public static String genSaltValue(int length) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < length; i++) {
-            sb.append(characters.charAt(random.nextInt(characters.length())));
-        }
-
-        return new String(sb);
-    }
-
-    public static byte[] hash(char[] password, byte[] salt) {
-        PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
-        Arrays.fill(password, Character.MIN_VALUE);
-        try {
-            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
-            return skf.generateSecret(spec).getEncoded();
-        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
-            throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
-        } finally {
-            spec.clearPassword();
-        }
-    }
-
-    public static String generateSecurePassword(String password, String salt) {
-        String res;
-        byte[] securePassword = hash(password.toCharArray(), salt.getBytes());
-
-        res = Base64.getEncoder().encodeToString(securePassword);
-        return res;
-    }
-
-    public static boolean verifyUserPassword(String providedPassword, String securedPassword, String salt) {
-        boolean res;
-        String newSecuredPassword = generateSecurePassword(providedPassword, salt);
-        res = newSecuredPassword.equals(securedPassword);
-
-        return res;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryptionPasswordEncoder.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/PassEncryptionPasswordEncoder.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security;
-
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Component;
-
-import static mk.ukim.finki.db.distributorapp.security.PassEncryption.generateSecurePassword;
-import static mk.ukim.finki.db.distributorapp.security.PassEncryption.verifyUserPassword;
-
-@Component
-public class PassEncryptionPasswordEncoder implements PasswordEncoder {
-
-    @Override
-    public String encode(CharSequence rawPassword) {
-        throw new UnsupportedOperationException("Salt must be provided explicitly!");
-    }
-
-    public String encodeWithSalt(CharSequence rawPassword, String salt) {
-        return generateSecurePassword(rawPassword.toString(), salt);
-    }
-
-    @Override
-    public boolean matches(CharSequence rawPassword, String encodedPassword) {
-        throw new UnsupportedOperationException("Use matchesWithSalt for explicit salt verification!");
-    }
-
-    public boolean matchesWithSalt(CharSequence rawPassword, String encodedPassword, String salt) {
-        return verifyUserPassword(rawPassword.toString(), encodedPassword, salt);
-    }
-}
-
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/SecurityConfig.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/SecurityConfig.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,91 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security;
-
-import lombok.RequiredArgsConstructor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.provisioning.InMemoryUserDetailsManager;
-import org.springframework.security.web.SecurityFilterChain;
-
-@Configuration
-@EnableWebSecurity
-@RequiredArgsConstructor
-public class SecurityConfig {
-
-    private final CustomUsernamePasswordAuthenticationProvider authenticationProvider;
-    private final SuperUserAuthenticationProvider superUserAuthenticationProvider;
-
-    @Bean
-    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-        http
-                .authorizeHttpRequests(auth -> auth
-                        .requestMatchers("/auth/**", "/rest/auth/**", "/reset-password/**", "/css/**", "/js/**").permitAll()
-                        .requestMatchers("/admin/**").hasRole("ADMIN")
-                        .requestMatchers("/customer/**").hasAnyRole("CUSTOMER", "ADMIN")
-                        .requestMatchers("/manager/**").hasAnyRole("MANAGER", "ADMIN")
-                        .requestMatchers("/driver/**").hasAnyRole("DRIVER", "ADMIN")
-                        .anyRequest()
-                        .authenticated()
-                )
-                .formLogin(login -> login
-                        .loginPage("/auth/login")
-                        .loginProcessingUrl("/auth/login")
-                        .usernameParameter("email")
-                        .passwordParameter("password")
-                        .defaultSuccessUrl("/home", true)
-                        .failureUrl("/auth/login?error=true")
-                        .permitAll()
-                )
-                .logout(logout -> logout
-                        .logoutUrl("/logout")
-                        .logoutSuccessUrl("/login?logout")
-                        .clearAuthentication(true)
-                        .invalidateHttpSession(true)
-                        .deleteCookies("JSESSIONID")
-                        .logoutSuccessUrl("/")
-                        .permitAll()
-                )
-                .exceptionHandling((ex) -> ex
-                        .accessDeniedPage("/access-denied"))
-                .csrf(AbstractHttpConfigurer::disable);
-
-        return http.build();
-    }
-
-    @Bean
-    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
-        PasswordEncoder standardEncoder = new BCryptPasswordEncoder();
-        UserDetails superUser = User.withUsername("superuser@admin.com")
-                .password(standardEncoder.encode("supersecret"))
-                .roles("ADMIN")
-                .build();
-        return new InMemoryUserDetailsManager(superUser);
-    }
-
-    @Bean
-    public AuthenticationManager authenticationManager(
-            HttpSecurity http
-    ) throws Exception {
-        AuthenticationManagerBuilder authenticationManagerBuilder =
-                http.getSharedObject(AuthenticationManagerBuilder.class);
-
-        authenticationManagerBuilder.authenticationProvider(superUserAuthenticationProvider);
-        authenticationManagerBuilder.authenticationProvider(authenticationProvider);
-
-        return authenticationManagerBuilder.build();
-    }
-
-    @Bean
-    public PasswordEncoder passwordEncoder() {
-        return new PassEncryptionPasswordEncoder();
-    }
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/SuperUserAuthenticationProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/SuperUserAuthenticationProvider.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,46 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security;
-
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Component;
-
-@Component
-public class SuperUserAuthenticationProvider implements AuthenticationProvider {
-
-    private static final String SUPERUSER_ENCODED_PASSWORD = "$2a$12$KC9Z0kHyu06iV4xlpKOgL.p2KH3NS9EY/N3g97nGAtC/NCpRXVgXa";
-
-    private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        String username = authentication.getName();
-        String rawPassword = authentication.getCredentials().toString();
-
-        if (!"superuser@admin.com".equalsIgnoreCase(username)) {
-            return null;
-        }
-
-        if (!passwordEncoder.matches(rawPassword, SUPERUSER_ENCODED_PASSWORD)) {
-            throw new BadCredentialsException("Invalid superuser credentials");
-        }
-
-        UserDetails superUser = User.withUsername("superuser@admin.com")
-                .password(SUPERUSER_ENCODED_PASSWORD)
-                .roles("ADMIN")
-                .build();
-
-        return new UsernamePasswordAuthenticationToken(superUser, superUser.getPassword(), superUser.getAuthorities());
-    }
-
-    @Override
-    public boolean supports(Class<?> authentication) {
-        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/AuthController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/AuthController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,94 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.auth;
-
-import jakarta.servlet.http.HttpServletRequest;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
-import mk.ukim.finki.db.distributorapp.security.dto.LoginRequestDto;
-import mk.ukim.finki.db.distributorapp.security.dto.RegisterRequestDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import mk.ukim.finki.db.distributorapp.exceptions.InvalidUserCredentialsException;
-import mk.ukim.finki.db.distributorapp.city.CityService;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import java.util.List;
-
-
-@Controller
-@RequestMapping("/auth")
-public class AuthController {
-
-    private final CityService cityService;
-    private final AuthService authService;
-
-    public AuthController(CityService cityService, AuthService authService) {
-        this.cityService = cityService;
-        this.authService = authService;
-    }
-
-    @GetMapping("/login")
-    public String login(@RequestParam(value = "error", required = false) String error, Model model) {
-        if (error != null) {
-            model.addAttribute("error", "Invalid username or password");
-        }
-        return "authentication/login";
-    }
-
-    @PostMapping("/login")
-    public String login(@ModelAttribute LoginRequestDto loginRequest, RedirectAttributes redirectAttributes) {
-        try {
-            UsersLoadingDto user = authService.login(loginRequest);
-
-            switch (user.getUserRole()) {
-                case "ROLE_CUSTOMER" -> {
-                    return "redirect:/home/customer";
-                }
-                case "ROLE_ADMIN" -> {
-                    return "redirect:/home/admin";
-                }
-                case "ROLE_MANAGER" -> {
-                    return "redirect:/home/manager";
-                }
-                case "ROLE_DRIVER" -> {
-                    return "redirect:/home/driver";
-                }
-                default -> {
-                    return "redirect:/home";
-                }
-            }
-        } catch (InvalidUserCredentialsException e) {
-            redirectAttributes.addFlashAttribute("error", "Invalid credentials.");
-            return "redirect:/auth/login";
-        }
-    }
-
-    @GetMapping("/register")
-    public String registerCustomer(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("cities", cities);
-        return "authentication/register";
-    }
-
-    @PostMapping("/register")
-    public String register(@ModelAttribute RegisterRequestDto registerRequest) throws Exception {
-        authService.register(registerRequest);
-        return "redirect:/auth/login";
-    }
-
-    @GetMapping("/changePass")
-    public String changePassword(Model model) {
-        return "authentication/changePass";
-    }
-
-    @GetMapping("/logout")
-    public String logout(HttpServletRequest req) {
-        req.getSession().invalidate();
-        return "redirect:/auth/login";
-    }
-
-    @PostMapping("/logout")
-    public String logout(Model model) {
-        return "redirect:/auth/login";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/AuthService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/AuthService.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.auth;
-
-import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
-import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
-import mk.ukim.finki.db.distributorapp.security.dto.LoginRequestDto;
-import mk.ukim.finki.db.distributorapp.security.dto.RegisterRequestDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-
-public interface AuthService {
-    void register(RegisterRequestDto registerRequest) throws Exception;
-
-    void createManager(CreateManagerDto createUserDto) throws Exception;
-
-    void createDriver(CreateDriverDto createDriverDto) throws Exception;
-
-    UsersLoadingDto login(LoginRequestDto loginRequest);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/AuthServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/AuthServiceImpl.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,173 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.auth;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.customer.CustomerRepository;
-import mk.ukim.finki.db.distributorapp.driver.DriverRepository;
-import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
-import mk.ukim.finki.db.distributorapp.manager.ManagerRepository;
-import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
-import mk.ukim.finki.db.distributorapp.token.TokenRepository;
-import mk.ukim.finki.db.distributorapp.users.Role;
-import mk.ukim.finki.db.distributorapp.token.TokenType;
-import mk.ukim.finki.db.distributorapp.exceptions.InvalidArgumentsException;
-import mk.ukim.finki.db.distributorapp.exceptions.InvalidUserCredentialsException;
-import mk.ukim.finki.db.distributorapp.security.EmailService;
-import mk.ukim.finki.db.distributorapp.security.PassEncryption;
-import mk.ukim.finki.db.distributorapp.security.PassEncryptionPasswordEncoder;
-import mk.ukim.finki.db.distributorapp.security.dto.LoginRequestDto;
-import mk.ukim.finki.db.distributorapp.security.dto.RegisterRequestDto;
-import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
-import mk.ukim.finki.db.distributorapp.users.UsersRepository;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalDateTime;
-import java.util.UUID;
-
-@Service
-@RequiredArgsConstructor
-public class AuthServiceImpl implements AuthService {
-
-    private final UsersRepository usersRepository;
-    private final TokenRepository tokenRepository;
-    private final EmailService emailService;
-    private final PassEncryptionPasswordEncoder passwordEncoder;
-    private final CustomerRepository customerRepository;
-    private final ManagerRepository managerRepository;
-    private final DriverRepository driverRepository;
-
-    @Override
-    @Transactional
-    public void register(RegisterRequestDto registerRequest) throws Exception {
-        String saltValue = PassEncryption.genSaltValue(30);
-        String safePass = passwordEncoder.encodeWithSalt(registerRequest.getPassword(), saltValue);
-
-        Integer res = this.usersRepository.create(
-                registerRequest.getName(),
-                registerRequest.getSurname(),
-                safePass,
-                registerRequest.getEmail(),
-                registerRequest.getMobile(),
-                saltValue,
-                false,
-                null,
-                registerRequest.getCity(),
-                Role.ROLE_CUSTOMER.name(),
-                "CUSTOMER");
-        if (res == 0) {
-            throw new Exception("User insertion failed");
-        }
-
-        UserDto user = this.usersRepository.findUserDtoByEmail(registerRequest.getEmail());
-        String t_value = UUID.randomUUID().toString();
-        tokenRepository.create(
-                t_value,
-                LocalDateTime.now().plusHours(1),
-                user.getId(),
-                TokenType.TOKEN_VERIFICATION.name()
-        );
-
-        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
-
-        SimpleMailMessage mailMessage = new SimpleMailMessage();
-        mailMessage.setTo(registerRequest.getEmail());
-        mailMessage.setSubject("Complete Registration!");
-        mailMessage.setText(("To confirm your account, please click here: " +
-                "https://localhost:8080/register/confirm-account?token=" + createdToken.getT_value()));
-        System.out.println("Confirmation Token: " + createdToken.getT_value());
-        emailService.sendEmail(mailMessage);
-
-        this.customerRepository.create(
-                user.getId(),
-                registerRequest.getEdb(),
-                registerRequest.getName(),
-                registerRequest.getAddress(),
-                registerRequest.getProfileImage());
-    }
-
-    @Override
-    @Transactional
-    public void createManager(CreateManagerDto createManagerDto) throws Exception {
-        String saltValue = PassEncryption.genSaltValue(30);
-        String safePass = passwordEncoder.encodeWithSalt(createManagerDto.getPassword(), saltValue);
-
-        Integer res = this.usersRepository.create(
-                createManagerDto.getName(),
-                createManagerDto.getSurname(),
-                safePass,
-                createManagerDto.getEmail(),
-                createManagerDto.getMobile(),
-                saltValue,
-                false,
-                null,
-                createManagerDto.getCity(),
-                Role.ROLE_MANAGER.name(),
-                "MANAGER");
-
-        if (res == 0) {
-            throw new Exception("User insertion failed");
-        }
-
-        UserDto user = this.usersRepository.findUserDtoByEmail(createManagerDto.getEmail());
-        this.managerRepository.create(
-                user.getId(),
-                createManagerDto.getWarehouseId()
-        );
-    }
-
-    @Override
-    @Transactional
-    public void createDriver(CreateDriverDto createDriverDto) throws Exception {
-        String saltValue = PassEncryption.genSaltValue(30);
-        String safePass = passwordEncoder.encodeWithSalt(createDriverDto.getPassword(), saltValue);
-
-        Integer res = this.usersRepository.create(
-                createDriverDto.getName(),
-                createDriverDto.getSurname(),
-                safePass,
-                createDriverDto.getEmail(),
-                createDriverDto.getMobile(),
-                saltValue,
-                false,
-                null,
-                createDriverDto.getCity(),
-                Role.ROLE_DRIVER.name(),
-                "DRIVER");
-
-        if (res == 0) {
-            throw new Exception("User insertion failed");
-        }
-
-        UserDto user = this.usersRepository.findUserDtoByEmail(createDriverDto.getEmail());
-        this.driverRepository.create(
-                user.getId(),
-                createDriverDto.getVehicle()
-        );
-    }
-
-    @Override
-    @Transactional
-    public UsersLoadingDto login(LoginRequestDto loginRequest) {
-        if (loginRequest.getEmail() == null
-                || loginRequest.getEmail().isEmpty()
-                || loginRequest.getPassword() == null
-                || loginRequest.getPassword().isEmpty()) {
-
-            throw new InvalidArgumentsException();
-        }
-
-        UsersLoadingDto user = this.usersRepository.findUsersByUserEmailIgnoreCaseDto(loginRequest.getEmail());
-
-        String secPassword = passwordEncoder
-                .encodeWithSalt(loginRequest.getPassword(), user.getUserSalt());
-
-        if (!secPassword.equals(user.getUserPassword())) {
-            throw new InvalidUserCredentialsException();
-        }
-
-        return user;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/PasswordResetController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/auth/PasswordResetController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,121 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.auth;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import mk.ukim.finki.db.distributorapp.token.TokenType;
-import mk.ukim.finki.db.distributorapp.token.TokenRepository;
-import mk.ukim.finki.db.distributorapp.security.EmailService;
-import mk.ukim.finki.db.distributorapp.security.PassEncryptionPasswordEncoder;
-import mk.ukim.finki.db.distributorapp.users.UsersService;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import java.time.LocalDateTime;
-import java.util.UUID;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping("/reset-password")
-public class PasswordResetController {
-    private final UsersService usersService;
-    private final EmailService emailService;
-    private final PassEncryptionPasswordEncoder passwordEncoder;
-    private final TokenRepository tokenRepository;
-
-
-    @GetMapping("/request")
-    public String resetPasswordRequest() {
-        return "authentication/reset-password-request";
-    }
-
-    @PostMapping("/reset-password-request")
-    public String resetPasswordRequest(@RequestParam("email") String email, Model model) {
-
-        UsersLoadingDto user = this.usersService.findFullUserDtoByEmail(email);
-        if (user == null) {
-            model.addAttribute("error", "No user found with this email.");
-            return "authentication/reset-password-request";
-        }
-
-        String t_value = UUID.randomUUID().toString();
-        tokenRepository.create(
-                t_value,
-                LocalDateTime.now().plusHours(1),
-                user.getUserId(),
-                TokenType.TOKEN_RESET.name()
-        );
-        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
-
-        UserDto dto = this.usersService.findUserDtoByEmail(email);
-        this.usersService.edit(dto);
-
-        String resetLink = "https://localhost:8080/reset-password?token=" + createdToken.getT_value();
-        String emailBody = "Click the link to reset your password: " + resetLink;
-
-        SimpleMailMessage message = new SimpleMailMessage();
-        message.setTo(email);
-        message.setSubject("Password Reset Request");
-        message.setText(emailBody);
-        emailService.sendEmail(message);
-
-        model.addAttribute("success", "A password link has been sent to your email.");
-        return "authentication/reset-password-request";
-    }
-
-    @GetMapping("/reset-password")
-    public String showResetPasswordForm(@RequestParam("token") String tokenValue, Model model) {
-
-        UsersLoadingDto user = usersService.findUserByResetToken(tokenValue);
-        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
-        if (user == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
-            model.addAttribute("error", "Invalid or expired token.");
-            return "authentication/reset-password";
-        }
-        model.addAttribute("token", token);
-        return "authentication/reset-password";
-    }
-
-    @PostMapping("/reset-password")
-    public String handleResetPassword(
-            @RequestParam("token") String tokenValue,
-            @RequestParam("newPassword") String newPassword,
-            @RequestParam("confirmPassword") String confirmPassword,
-            Model model) {
-
-        UsersLoadingDto user = usersService.findUserByResetToken(tokenValue);
-        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
-        if (user.getUserId() == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
-            model.addAttribute("error", "Invalid or expired token.");
-            return "authentication/reset-password";
-        }
-
-        if (!newPassword.equals(confirmPassword)) {
-            model.addAttribute("error", "Passwords do not match.");
-            return "authentication/reset-password";
-        }
-
-        user.setUserPassword(passwordEncoder.encodeWithSalt(newPassword, user.getUserSalt()));
-        token.setT_validated_at(LocalDateTime.now());
-        tokenRepository.edit(
-                token.getT_id(),
-                token.getT_value(),
-                token.getT_expiry(),
-                token.getUser_id(),
-                token.getT_validated_at(),
-                token.getT_type()
-        );
-
-        UserDto dto = this.usersService.findUserDtoByEmail(user.getUserEmail());
-        this.usersService.edit(dto);
-
-        model.addAttribute("success", "Your password has been reset successfully.");
-        return "authentication/reset-password";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/ChangePasswordDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/ChangePasswordDto.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ChangePasswordDto {
-    String email;
-    String oldPassword;
-    String newPassword;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/LoginRequestDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/LoginRequestDto.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class LoginRequestDto {
-    private String email;
-    private String password;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/LoginResponseDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/LoginResponseDto.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class LoginResponseDto {
-    private String token;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/RegisterRequestDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/security/dto/RegisterRequestDto.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class RegisterRequestDto {
-    private String name;
-    private String surname;
-    private String password;
-    private String repeatedPassword;
-    private String email;
-    private String mobile;
-    private String profileImage;
-    private Integer city;
-    private String edb;
-    private String compName;
-    private String address;
-    private String repImage;
-}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -6,8 +6,7 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.Users;
+import mk.ukim.finki.db.distributorapp.users.User;
 
 import java.time.LocalDateTime;
-import java.util.UUID;
 
 @Data
@@ -15,5 +14,5 @@
 @AllArgsConstructor
 @Entity
-@Table(name = "token")
+@Table(name = "token_")
 public class Token {
     @Id
@@ -40,11 +39,4 @@
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "t_user", referencedColumnName = "user_id", nullable = false, unique = true)
-    private Users user;
-
-    public Token(Users user, TokenType tokenType) {
-        this.user = user;
-        this.tokenType = tokenType;
-        this.createdDate = LocalDateTime.now();
-        this.tokenValue = UUID.randomUUID().toString();
-    }
+    private User user;
 }
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/users/User.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/User.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/users/User.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,140 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import mk.ukim.finki.db.distributorapp.city.City;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import mk.ukim.finki.db.distributorapp.token.Token;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Inheritance(strategy = InheritanceType.JOINED)
+@DiscriminatorColumn(
+        name = "clazz_",
+        discriminatorType = DiscriminatorType.STRING
+)
+@Data
+@Table(name = "users")
+public class User implements UserDetails {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "user_id")
+    private Long userId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_name", nullable = false)
+    private String userName;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_surname", nullable = false)
+    private String userSurname;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_pass", nullable = false)
+    private String userPassword;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_email", nullable = false)
+    private String userEmail;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_mobile", nullable = false)
+    private String userMobile;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_salt", nullable = false)
+    private String userSalt;
+
+    @NotNull
+    @Column(name = "user_active", nullable = false)
+    private Boolean userActive;
+
+    @Size(max = 255)
+    @Column(name = "user_image")
+    private String userImage;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "user_role")
+    private Role userRole;
+
+    @Column(name = "clazz_", insertable = false, updatable = false)
+    private String clazz_;
+
+    @OneToMany(mappedBy = "user")
+    private List<Token> tokens;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "city_id", nullable = false)
+    private City city;
+
+    public User(UsersLoadingDto dto) {
+        this.userRole = Role.valueOf(dto.getUserRole());
+        this.userId = dto.getUserId();
+        this.userName = dto.getUserName();
+        this.userSurname = dto.getUserSurname();
+        this.userPassword = dto.getUserPassword();
+        this.userEmail = dto.getUserEmail();
+        this.userMobile = dto.getUserMobile();
+        this.userSalt = dto.getUserSalt();
+        this.userActive = dto.getUserActive();
+        this.userImage = dto.getUserImage();
+        this.tokens = null;
+        this.city = null;
+    }
+
+    @Override
+    public String getUsername() {
+        return userEmail;
+    }
+
+    @Override
+    public String getPassword() {
+        return userPassword;
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        List<GrantedAuthority> authorities = new ArrayList<>();
+        authorities.add(new SimpleGrantedAuthority(this.getUserRole().name()));
+        return authorities;
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return userActive;
+    }
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,126 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface UserRepository extends JpaRepository<User, Long> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into users(user_name,user_surname,user_pass,user_salt,user_email,user_mobile,user_active,user_image,city_id,user_role,clazz_) " +
+                    "values (:name,:sur,:pass,:salt,:email,:mob,:active,:img,:cty,:role,:clazz_)"
+    )
+    Integer create(
+            @NonNull @Param("name") String name,
+            @NonNull @Param("sur") String surname,
+            @NonNull @Param("pass") String password,
+            @NonNull @Param("email") String email,
+            @NonNull @Param("mob") String mobile,
+            @NonNull @Param("salt") String salt,
+            @NonNull @Param("active") Boolean active,
+            @Param("img") String image,
+            @NonNull @Param("cty") Integer city_id,
+            @NonNull @Param("role") String role,
+            @NonNull @Param("clazz_") String clazz_);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update users " +
+                    "set user_name=:name,user_surname=:sur,user_pass=:pass,user_email=:email,user_mobile=:mob,user_salt=:salt,user_active=:active,user_image=:img,city_id=:cty,user_role=:role,clazz_=:clazz_ " +
+                    "where user_id=:id"
+    )
+    Integer edit(
+            @NonNull @Param("id") Long id,
+            @NonNull @Param("name") String name,
+            @NonNull @Param("sur") String surname,
+            @NonNull @Param("pass") String password,
+            @NonNull @Param("email") String email,
+            @NonNull @Param("mob") String mobile,
+            @NonNull @Param("salt") String salt,
+            @NonNull @Param("active") Boolean active,
+            @NonNull @Param("img") String image,
+            @NonNull @Param("cty") Integer city_id,
+            @NonNull @Param("role") String role,
+            @NonNull @Param("clazz_") String clazz_);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from users where user_id=:id"
+    )
+    void delete(@NonNull @Param("id") Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select user_id as userId,
+                           user_name as userName,
+                           user_surname as userSurname,
+                           user_pass as userPassword,
+                           user_email as userEmail,
+                           user_mobile as userMobile,
+                           user_salt as userSalt,
+                           user_active as userActive,
+                           user_image as userImage,
+                           user_role as userRole,
+                           clazz_
+                    from users
+                    where user_email = ?1
+                    """
+    )
+    UsersLoadingDto findUsersByUserEmailIgnoreCaseDto(String email);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select u.user_id as id,
+                           u.user_name as firstName,
+                           u.user_surname as lastName,
+                           u.user_email as email,
+                           u.user_mobile as phone,
+                           u.user_image as image,
+                           u.city_id as cityId,
+                           c.city_name as cityName,
+                           r.region_name as regionName,
+                           u.user_role as role,
+                           clazz_ as clazz_,
+                           u.user_active as userActive
+                    from users u
+                    join city c on u.city_id = c.city_id
+                    join region r on c.region_id = r.region_id
+                    where user_email = ?1
+                    """
+    )
+    UserDto findUserDtoByEmail(String userEmail);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select u.user_id as userId,
+                           u.user_name as userName,
+                           u.user_surname as userSurname,
+                           u.user_pass as userPassword,
+                           u.user_email as userEmail,
+                           u.user_mobile as userMobile,
+                           u.user_salt as userSalt,
+                           u.user_active as userActive,
+                           u.user_image as userImage,
+                           u.user_role as userRole,
+                           u.clazz_ as clazz_
+                    from users u
+                    join token t on u.user_id=t.t_user
+                    where t.t_value = :token
+                    """
+    )
+    UsersLoadingDto findUserByResetToken(@NonNull @Param("token") String token);
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,16 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+
+public interface UserService {
+    Integer edit(UserDto userDto);
+
+    void deleteUserById(Long id);
+
+    UsersLoadingDto findUserByResetToken(String token);
+
+    UserDto findUserDtoByEmail(String userEmail);
+
+    UsersLoadingDto findFullUserDtoByEmail(String userEmail);
+}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -0,0 +1,52 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class UserServiceImpl implements UserService {
+
+    private final UserRepository userRepository;
+
+    @Override
+    public Integer edit(UserDto userDto) {
+        UsersLoadingDto user = this.userRepository.findUsersByUserEmailIgnoreCaseDto(userDto.getEmail());
+        return this.userRepository.edit(
+                userDto.getId(),
+                userDto.getFirstName(),
+                userDto.getLastName(),
+                user.getUserPassword(),
+                userDto.getEmail(),
+                userDto.getPhone(),
+                user.getUserSalt(),
+                userDto.getUserActive(),
+                userDto.getImage(),
+                userDto.getCityId(),
+                userDto.getRole(),
+                userDto.getClazz_()
+        );
+    }
+
+    @Override
+    public UsersLoadingDto findUserByResetToken(String token) {
+        return this.userRepository.findUserByResetToken(token);
+    }
+
+    @Override
+    public UserDto findUserDtoByEmail(String userEmail) {
+        return this.userRepository.findUserDtoByEmail(userEmail);
+    }
+
+    @Override
+    public UsersLoadingDto findFullUserDtoByEmail(String userEmail) {
+        return this.userRepository.findUsersByUserEmailIgnoreCaseDto(userEmail);
+    }
+
+    @Override
+    public void deleteUserById(Long id) {
+        this.userRepository.delete(id);
+    }
+}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/Users.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/Users.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,140 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import mk.ukim.finki.db.distributorapp.city.City;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import mk.ukim.finki.db.distributorapp.token.Token;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-@Entity
-@AllArgsConstructor
-@NoArgsConstructor
-@Inheritance(strategy = InheritanceType.JOINED)
-@DiscriminatorColumn(
-        name = "clazz_",
-        discriminatorType = DiscriminatorType.STRING
-)
-@Data
-@Table(name = "users")
-public class Users implements UserDetails {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "user_id")
-    private Long userId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_name", nullable = false)
-    private String userName;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_surname", nullable = false)
-    private String userSurname;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_pass", nullable = false)
-    private String userPassword;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_email", nullable = false)
-    private String userEmail;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_mobile", nullable = false)
-    private String userMobile;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_salt", nullable = false)
-    private String userSalt;
-
-    @NotNull
-    @Column(name = "user_active", nullable = false)
-    private Boolean userActive;
-
-    @Size(max = 255)
-    @Column(name = "user_image")
-    private String userImage;
-
-    @Enumerated(EnumType.STRING)
-    @Column(name = "user_role")
-    private Role userRole;
-
-    @OneToMany(mappedBy = "user")
-    private List<Token> tokens;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "city_id", nullable = false)
-    private City city;
-
-    @Column(name = "clazz_", insertable = false, updatable = false)
-    private String clazz_;
-
-    public Users(UsersLoadingDto dto) {
-        this.userRole = Role.valueOf(dto.getUserRole());
-        this.userId = dto.getUserId();
-        this.userName = dto.getUserName();
-        this.userSurname = dto.getUserSurname();
-        this.userPassword = dto.getUserPassword();
-        this.userEmail = dto.getUserEmail();
-        this.userMobile = dto.getUserMobile();
-        this.userSalt = dto.getUserSalt();
-        this.userActive = dto.getUserActive();
-        this.userImage = dto.getUserImage();
-        this.tokens = null;
-        this.city = null;
-    }
-
-    @Override
-    public String getUsername() {
-        return userEmail;
-    }
-
-    @Override
-    public String getPassword() {
-        return userPassword;
-    }
-
-    @Override
-    public Collection<? extends GrantedAuthority> getAuthorities() {
-        List<GrantedAuthority> authorities = new ArrayList<>();
-        authorities.add(new SimpleGrantedAuthority(this.getUserRole().name()));
-        return authorities;
-    }
-
-    @Override
-    public boolean isAccountNonExpired() {
-        return true;
-    }
-
-    @Override
-    public boolean isAccountNonLocked() {
-        return true;
-    }
-
-    @Override
-    public boolean isCredentialsNonExpired() {
-        return true;
-    }
-
-    @Override
-    public boolean isEnabled() {
-        return userActive;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/UsersRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UsersRepository.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,126 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface UsersRepository extends JpaRepository<Users, Long> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into users(user_name,user_surname,user_pass,user_salt,user_email,user_mobile,user_active,user_image,city_id,user_role,clazz_) " +
-                    "values (:name,:sur,:pass,:salt,:email,:mob,:active,:img,:cty,:role,:clazz_)"
-    )
-    Integer create(
-            @NonNull @Param("name") String name,
-            @NonNull @Param("sur") String surname,
-            @NonNull @Param("pass") String password,
-            @NonNull @Param("email") String email,
-            @NonNull @Param("mob") String mobile,
-            @NonNull @Param("salt") String salt,
-            @NonNull @Param("active") Boolean active,
-            @Param("img") String image,
-            @NonNull @Param("cty") Integer city_id,
-            @NonNull @Param("role") String role,
-            @NonNull @Param("clazz_") String clazz_);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update users " +
-                    "set user_name=:name,user_surname=:sur,user_pass=:pass,user_email=:email,user_mobile=:mob,user_salt=:salt,user_active=:active,user_image=:img,city_id=:cty,user_role=:role,clazz_=:clazz_ " +
-                    "where user_id=:id"
-    )
-    Integer edit(
-            @NonNull @Param("id") Long id,
-            @NonNull @Param("name") String name,
-            @NonNull @Param("sur") String surname,
-            @NonNull @Param("pass") String password,
-            @NonNull @Param("email") String email,
-            @NonNull @Param("mob") String mobile,
-            @NonNull @Param("salt") String salt,
-            @NonNull @Param("active") Boolean active,
-            @NonNull @Param("img") String image,
-            @NonNull @Param("cty") Integer city_id,
-            @NonNull @Param("role") String role,
-            @NonNull @Param("clazz_") String clazz_);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from users where user_id=:id"
-    )
-    void delete(@NonNull @Param("id") Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select user_id as userId,
-                           user_name as userName,
-                           user_surname as userSurname,
-                           user_pass as userPassword,
-                           user_email as userEmail,
-                           user_mobile as userMobile,
-                           user_salt as userSalt,
-                           user_active as userActive,
-                           user_image as userImage,
-                           user_role as userRole,
-                           clazz_
-                    from users
-                    where user_email = ?1
-                    """
-    )
-    UsersLoadingDto findUsersByUserEmailIgnoreCaseDto(String email);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select u.user_id as id,
-                           u.user_name as firstName,
-                           u.user_surname as lastName,
-                           u.user_email as email,
-                           u.user_mobile as phone,
-                           u.user_image as image,
-                           u.city_id as cityId,
-                           c.city_name as cityName,
-                           r.region_name as regionName,
-                           u.user_role as role,
-                           clazz_ as clazz_,
-                           u.user_active as userActive
-                    from users u
-                    join city c on u.city_id = c.city_id
-                    join region r on c.region_id = r.region_id
-                    where user_email = ?1
-                    """
-    )
-    UserDto findUserDtoByEmail(String userEmail);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select u.user_id as userId,
-                           u.user_name as userName,
-                           u.user_surname as userSurname,
-                           u.user_pass as userPassword,
-                           u.user_email as userEmail,
-                           u.user_mobile as userMobile,
-                           u.user_salt as userSalt,
-                           u.user_active as userActive,
-                           u.user_image as userImage,
-                           u.user_role as userRole,
-                           u.clazz_ as clazz_
-                    from users u
-                    join token t on u.user_id=t.t_user
-                    where t.t_value = :token
-                    """
-    )
-    UsersLoadingDto findUserByResetToken(@NonNull @Param("token") String token);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/UsersService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UsersService.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,16 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-
-public interface UsersService {
-    Integer edit(UserDto userDto);
-
-    void deleteUserById(Long id);
-
-    UsersLoadingDto findUserByResetToken(String token);
-
-    UserDto findUserDtoByEmail(String userEmail);
-
-    UsersLoadingDto findFullUserDtoByEmail(String userEmail);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/UsersServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UsersServiceImpl.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,52 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class UsersServiceImpl implements UsersService {
-
-    private final UsersRepository usersRepository;
-
-    @Override
-    public Integer edit(UserDto userDto) {
-        UsersLoadingDto user = this.usersRepository.findUsersByUserEmailIgnoreCaseDto(userDto.getEmail());
-        return this.usersRepository.edit(
-                userDto.getId(),
-                userDto.getFirstName(),
-                userDto.getLastName(),
-                user.getUserPassword(),
-                userDto.getEmail(),
-                userDto.getPhone(),
-                user.getUserSalt(),
-                userDto.getUserActive(),
-                userDto.getImage(),
-                userDto.getCityId(),
-                userDto.getRole(),
-                userDto.getClazz_()
-        );
-    }
-
-    @Override
-    public UsersLoadingDto findUserByResetToken(String token) {
-        return this.usersRepository.findUserByResetToken(token);
-    }
-
-    @Override
-    public UserDto findUserDtoByEmail(String userEmail) {
-        return this.usersRepository.findUserDtoByEmail(userEmail);
-    }
-
-    @Override
-    public UsersLoadingDto findFullUserDtoByEmail(String userEmail) {
-        return this.usersRepository.findUsersByUserEmailIgnoreCaseDto(userEmail);
-    }
-
-    @Override
-    public void deleteUserById(Long id) {
-        this.usersRepository.delete(id);
-    }
-}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -50,5 +50,5 @@
 
     @NotNull
-    @Column(name = "veh_reg", nullable = false)
+    @Column(name = "veh_reg_date", nullable = false)
     private Date vehicleRegDate;
 
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/web/AdminController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/web/AdminController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,122 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
-import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
-import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
-import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
-import mk.ukim.finki.db.distributorapp.security.auth.AuthService;
-import mk.ukim.finki.db.distributorapp.city.CityService;
-import mk.ukim.finki.db.distributorapp.driver.DriverService;
-import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
-import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping("/admin")
-public class AdminController {
-
-    private final AuthService authService;
-    private final CityService cityService;
-    private final WarehouseService warehouseService;
-    private final DriverService driverService;
-    private final VehicleService vehicleService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String getDashboard(Model model) {
-        return "home/admin";
-    }
-
-    //    MANAGER CONTROLS:
-
-    @GetMapping("/create-manager")
-    public String createManager(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("cities", cities);
-        model.addAttribute("manager", new CreateManagerDto());
-        return "create-manager";
-    }
-
-    @PostMapping("/create-manager")
-    public String createManager(@ModelAttribute("manager") CreateManagerDto createManagerDto) throws Exception {
-        WarehouseDto wh = this.warehouseService.findByCityId(createManagerDto.getCity());
-        createManagerDto.setWarehouseId(wh.getId());
-        this.authService.createManager(createManagerDto);
-        return "redirect:/manager/all";
-    }
-
-    @GetMapping("/edit-manager")
-    public String editManager() {
-        return "edit-manager";
-    }
-
-    @GetMapping("/warehouse-by-city")
-    @ResponseBody
-    public WarehouseDto getWarehouseByCity(@RequestParam("cityId") Integer cityId) {
-        return this.warehouseService.findByCityId(cityId);
-    }
-
-    //    DRIVER CONTROLS:
-    @GetMapping("/create-driver")
-    public String createDriver(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("cities", cities);
-        model.addAttribute("driver", new CreateDriverDto());
-        return "create-driver";
-    }
-
-    @GetMapping("/vehicle-by-city")
-    @ResponseBody
-    public List<VehicleBasicDto> getVehicleByCity(@RequestParam("cityId") Integer cityId) {
-        WarehouseDto wh = this.warehouseService.findByCityId(cityId);
-        return this.vehicleService.getVehiclesByWarehouse(wh.getId());
-    }
-
-    @PostMapping("/create-driver")
-    public String createDriver(@ModelAttribute("driver") CreateDriverDto createDriverDto, @ModelAttribute("vehicle") VehicleDto vehicleDto) throws Exception {
-        this.authService.createDriver(createDriverDto);
-        return "all-drivers";
-    }
-
-    @GetMapping("/edit-driver/{id}")
-    public String editDriver(@PathVariable("id") Long id, Model model) {
-        DriverDto driver = this.driverService.findById(id);
-        model.addAttribute("driver", driver);
-        return "edit-driver";
-    }
-
-    @PostMapping("/edit-driver/{id}")
-    public String editDriver(@PathVariable("id") Long id, @ModelAttribute("driver") DriverDto driverDto, Model model) {
-        Integer res = this.driverService.edit(driverDto);
-        if (res == 1) {
-            model.addAttribute("edit-success", true);
-        } else {
-            model.addAttribute("edit-success", false);
-        }
-        return "all-drivers";
-    }
-
-    //    WAREHOUSE CONTROLS:
-
-    @GetMapping("/create-warehouse")
-    public String createWarehouse(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("warehouse", new WarehouseDto());
-        model.addAttribute("cities", cities);
-        return "create-warehouse";
-    }
-
-    @PostMapping("/create-warehouse")
-    public String createWarehouse(@ModelAttribute("warehouse") WarehouseDto warehouseDto, Model model) {
-        this.warehouseService.create(warehouseDto);
-        return "redirect:/warehouse";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/web/CustomerController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/web/CustomerController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,132 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.article.ArticleService;
-import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
-import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnitService;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
-import mk.ukim.finki.db.distributorapp.category.CategoryService;
-import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
-import mk.ukim.finki.db.distributorapp.customer.CustomerService;
-import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
-import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
-import mk.ukim.finki.db.distributorapp.manufacturer.ManufacturerService;
-import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
-import mk.ukim.finki.db.distributorapp.order.OrdersService;
-import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
-import mk.ukim.finki.db.distributorapp.users.UsersService;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.*;
-
-import java.security.Principal;
-import java.util.List;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping(value = "/customer")
-public class CustomerController {
-    private final CustomerService customerService;
-    private final UsersService usersService;
-    private final OrdersService ordersService;
-    private final DeliveryService deliveryService;
-    private final CategoryService categoryService;
-    private final WarehouseService warehouseService;
-    private final ArticleService articleService;
-    private final ArticleUnitService articleUnitService;
-    private final ManufacturerService manufacturerService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String dashboard(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        CustomerDto customer = this.customerService.findCustomerById(user.getId());
-        model.addAttribute("customer", customer);
-        model.addAttribute("currentOrders", ordersService.findCurrentOrdersByCustomer(customer.getId()));
-        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByCustomer(customer.getId()));
-        return "home/customer";
-    }
-
-    @GetMapping("/my-orders")
-    public String myOrders(Model model) {
-        return "my-orders";
-    }
-
-    @GetMapping("/create-order")
-    public String createOrder(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
-        String userEmail = authentication.getName();
-
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        WarehouseDto warehouse = this.warehouseService.findByCityId(user.getCityId());
-
-        List<CategoryDto> categories = this.categoryService.listCategories();
-        List<ArticleDto> articles = this.articleService.getAllArticlesByWarehouse(warehouse.getId());
-        List<ManufacturerDto> manufacturers = this.manufacturerService.getAllManufacturers();
-        List<ArticleUnitDto> articleUnits = this.articleUnitService.getAllArticleUnitsByWarehouse(warehouse.getId());
-
-        model.addAttribute("categories", categories);
-        model.addAttribute("articles", articles);
-        model.addAttribute("manufacturers", manufacturers);
-        model.addAttribute("articleUnits", articleUnits);
-        return "create-order";
-    }
-
-    @InitBinder
-    public void initBinder(WebDataBinder binder) {
-        ObjectMapper objectMapper = new ObjectMapper();
-        binder.registerCustomEditor(List.class, "orderItems", new java.beans.PropertyEditorSupport() {
-            @Override
-            public void setAsText(String text) throws IllegalArgumentException {
-                try {
-                    List<OrderItemDto> items = objectMapper.readValue(
-                            text, new TypeReference<List<OrderItemDto>>() {
-                            }
-                    );
-                    setValue(items);
-                } catch (Exception e) {
-                    throw new IllegalArgumentException("Invalid JSON for order items", e);
-                }
-            }
-        });
-    }
-
-    @PostMapping("/create-order")
-    public String createOrder(@ModelAttribute CreateOrderDto createOrderDto, Principal principal) {
-
-        this.ordersService.create(createOrderDto, principal);
-
-        String userEmail = principal.getName();
-
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        CustomerDto customer = this.customerService.findCustomerById(user.getId());
-
-        List<OrderSimpleDto> simpleCustomerOrders = this.ordersService.findSimpleOrdersByCustomer(customer.getId());
-        OrderSimpleDto createdOrder = simpleCustomerOrders.get(simpleCustomerOrders.size() - 1);
-        WarehouseDto wh = this.warehouseService.findByCityId(user.getCityId());
-
-        List<ArticleUnitSimpleDto> editedUnits = this.articleUnitService.addArticleUnitToOrder(createOrderDto.getOrderItems(), createdOrder.getId(), wh.getId());
-
-        for (ArticleUnitSimpleDto unit : editedUnits) {
-            this.articleUnitService.simpleEdit(unit);
-        }
-
-        return "redirect:/customer/dashboard";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/web/DriverController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/web/DriverController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,53 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.driver.DriverService;
-import mk.ukim.finki.db.distributorapp.users.UsersService;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping(value = "/driver")
-public class DriverController {
-    private final DriverService driverService;
-    private final UsersService usersService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String dashboard(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        model.addAttribute("user", user);
-        model.addAttribute("startDelivery", new DeliveryStartDto());
-        model.addAttribute("endDelivery", new DeliveryEndDto());
-        model.addAttribute("ongoingDeliveries", this.driverService.getOngoingDeliveries(user.getId()));
-        model.addAttribute("newDeliveries", this.driverService.getNewAssignedDeliveries(user.getId()));
-        model.addAttribute("finishedDeliveries", this.driverService.getFinishedAssignedDeliveries(user.getId()));
-        return "home/driver";
-    }
-
-    @PostMapping("/start-delivery")
-    public String startDelivery(@ModelAttribute("startDelivery") DeliveryStartDto delivery) {
-        this.driverService.startDelivery(delivery);
-        return "redirect:/driver/dashboard";
-    }
-
-    @PostMapping("/end-delivery")
-    public String endDelivery(@ModelAttribute("endDelivery") DeliveryEndDto delivery) {
-        this.driverService.endDelivery(delivery);
-        return "redirect:/driver/dashboard";
-    }
-
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/web/HomeController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/web/HomeController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,54 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.UsersService;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping({"/", "/home"})
-public class HomeController {
-    private final UsersService usersService;
-
-    @GetMapping
-    public String homePage(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
-        if (authentication == null || !authentication.isAuthenticated() || authentication.getPrincipal().equals("anonymousUser")) {
-            model.addAttribute("userType", "Guest");
-            return "authentication/login";
-        }
-
-        String userEmail = authentication.getName();
-        if (userEmail.equals("superuser@admin.com")) {
-            return "redirect:/admin/dashboard";
-        }
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        switch (user.getRole()) {
-            case "ROLE_CUSTOMER" -> {
-                return "redirect:/customer/dashboard";
-            }
-            case "ROLE_DRIVER" -> {
-                return "redirect:/driver/dashboard";
-            }
-            case "ROLE_MANAGER" -> {
-                return "redirect:/manager/dashboard";
-            }
-        }
-        model.addAttribute("userType", "Guest");
-        return "authentication/login";
-    }
-
-    @GetMapping("/access_denied")
-    public String getAccessDeniedPage(Model model) {
-        model.addAttribute("error", "access_denied");
-        return "authentication/access_denied";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/web/ManagerController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/web/ManagerController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,81 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-import mk.ukim.finki.db.distributorapp.order.OrdersService;
-import mk.ukim.finki.db.distributorapp.users.UsersService;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
-import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import java.util.List;
-
-@Controller
-@RequestMapping(value = "/manager")
-@RequiredArgsConstructor
-public class ManagerController {
-    private final UsersService usersService;
-    private final VehicleService vehicleService;
-    private final OrdersService ordersService;
-    private final WarehouseService warehouseService;
-    private final DeliveryService deliveryService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String dashboard(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        model.addAttribute("user", user);
-        model.addAttribute("currentInventory", warehouseService.getInventoryByManager(user.getId()));
-        model.addAttribute("vehicleStatus", vehicleService.getVehiclesByManager(user.getId()));
-        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
-        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByManager(user.getId()));
-        return "home/manager";
-    }
-
-    @GetMapping("/all")
-    public String allManagers(Model model) {
-        return "all-managers";
-    }
-
-    @GetMapping("/create-delivery")
-    public String createDelivery(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        model.addAttribute("user", user);
-        model.addAttribute("newDelivery", new DeliveryCreateDto());
-        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
-        model.addAttribute("vehicles", vehicleService.getVehiclesByManager(user.getId()));
-
-        return "create-delivery";
-    }
-
-    @PostMapping("/create-delivery")
-    public String createDelivery(@ModelAttribute DeliveryCreateDto newDelivery) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.usersService.findUserDtoByEmail(userEmail);
-
-        this.deliveryService.create(newDelivery);
-
-        List<DeliverySimpleDto> deliveries = this.deliveryService.getDeliveriesByVehicle(newDelivery.getVehId());
-        DeliverySimpleDto createdDelivery = deliveries.get(0);
-
-        this.ordersService.addOrdersToDelivery(newDelivery.getOrders(), createdDelivery.getDeliveryId());
-
-        return "redirect:/manager/dashboard";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/web/WarehouseController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/web/WarehouseController.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package mk.ukim.finki.db.distributorapp.web;
-
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@Controller
-@RequestMapping(value = "/warehouse")
-public class WarehouseController {
-    @GetMapping("/create")
-    public String createWarehouse() {
-        return "create-warehouse";
-    }
-}
Index: backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java	(revision 9e797903b9928cc82e0f21f8219ab23cf26ba405)
+++ backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java	(revision 16095d1a55a725cbd5c30ac3144c58e3d37b3aca)
@@ -16,5 +16,5 @@
     @Id
     @Column(name = "day_id", nullable = false)
-    private Short id;
+    private Short weekdayId;
 
     @Size(max = 20)
@@ -25,4 +25,4 @@
     @OneToMany(mappedBy = "day")
     private Set<CustomerWeekday> customerWeekdays = new LinkedHashSet<>();
-
+    // ? Set<CustomerWeekday> or List<CustomerWeekday>
 }
