Index: src/main/java/mk/ukim/finki/easyfood/config/SecurityConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/config/SecurityConfig.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ src/main/java/mk/ukim/finki/easyfood/config/SecurityConfig.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -7,6 +7,11 @@
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
 import org.springframework.security.web.SecurityFilterChain;
+
 
 @Configuration
@@ -36,4 +41,6 @@
                 .authorizeHttpRequests(authz -> authz
                         .requestMatchers("/login", "/register", "/css/**", "/js/**", "/images/**", "/error", "/home", "/").permitAll()
+                        .requestMatchers("/admin/register").permitAll()
+                        .requestMatchers("/admin/**").hasRole("ADMIN")
                         .anyRequest().authenticated()
                 )
@@ -60,3 +67,5 @@
         return http.build();
     }
+
+
 }
Index: src/main/java/mk/ukim/finki/easyfood/model/RestaurantOwner.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/RestaurantOwner.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ src/main/java/mk/ukim/finki/easyfood/model/RestaurantOwner.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -6,4 +6,5 @@
 import mk.ukim.finki.easyfood.model.enumerations.ROLE;
 
+import java.time.LocalTime;
 import java.util.List;
 
@@ -27,4 +28,13 @@
         super(email, password, firstName, lastName, phone, role);
     }
+
+
+    public List<Restaurant> getRestaurants() {
+        return restaurants;
+    }
+
+    public void setRestaurants(List<Restaurant> restaurants) {
+        this.restaurants = restaurants;
+    }
 }
 
Index: src/main/java/mk/ukim/finki/easyfood/model/enumerations/ROLE.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/enumerations/ROLE.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ src/main/java/mk/ukim/finki/easyfood/model/enumerations/ROLE.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -4,4 +4,5 @@
     CUSTOMER,
     DELIVERY_MAN,
-    RESTAURANT_OWNER
+    RESTAURANT_OWNER,
+    ADMIN
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/DeliveryManRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/DeliveryManRepository.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ src/main/java/mk/ukim/finki/easyfood/repository/DeliveryManRepository.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -5,5 +5,8 @@
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
+
 @Repository
 public interface DeliveryManRepository extends JpaRepository<DeliveryMan, Long> {
+    Optional<DeliveryMan> findByEmail(String email);
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/RestaurantOwnerRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/RestaurantOwnerRepository.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ src/main/java/mk/ukim/finki/easyfood/repository/RestaurantOwnerRepository.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -5,5 +5,8 @@
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
+
 @Repository
 public interface RestaurantOwnerRepository extends JpaRepository<RestaurantOwner, Long> {
+    Optional<RestaurantOwner> findByEmail(String email);
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/RestaurantOwnerService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/RestaurantOwnerService.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
+++ src/main/java/mk/ukim/finki/easyfood/service/RestaurantOwnerService.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -0,0 +1,9 @@
+package mk.ukim.finki.easyfood.service;
+
+import mk.ukim.finki.easyfood.model.Restaurant;
+import mk.ukim.finki.easyfood.model.RestaurantOwner;
+
+import java.time.LocalTime;
+
+public interface RestaurantOwnerService {
+}
Index: src/main/java/mk/ukim/finki/easyfood/service/UserService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/UserService.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ src/main/java/mk/ukim/finki/easyfood/service/UserService.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -3,4 +3,6 @@
 import mk.ukim.finki.easyfood.model.AppUser;
 import mk.ukim.finki.easyfood.model.Customer;
+import mk.ukim.finki.easyfood.model.DeliveryMan;
+import mk.ukim.finki.easyfood.model.enumerations.ROLE;
 
 import java.util.Optional;
@@ -14,4 +16,16 @@
 
     public Customer save(Customer customer);
+
+    DeliveryMan registerDeliveryMan(String fullName, String email, String phoneNumber,
+                                    String password, String repeatPassword);
+
+    DeliveryMan getDeliveryManById(Long id);
+
+    Optional<DeliveryMan> findDeliveryManByEmail(String email);
+
+    DeliveryMan save(DeliveryMan deliveryMan);
+
+    AppUser registerUserWithRole(String fullName, String email, String phoneNumber,
+                                 String password, String repeatPassword, ROLE role);
 }
 
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/RestaurantOwnerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/RestaurantOwnerServiceImpl.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/RestaurantOwnerServiceImpl.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.easyfood.service.impl;
+
+import mk.ukim.finki.easyfood.model.RestaurantOwner;
+import mk.ukim.finki.easyfood.model.enumerations.ROLE;
+import mk.ukim.finki.easyfood.model.exceptions.InvalidArgumentsException;
+import mk.ukim.finki.easyfood.model.exceptions.PasswordsDoNotMatchException;
+import mk.ukim.finki.easyfood.model.exceptions.UsernameAlreadyExistsException;
+import mk.ukim.finki.easyfood.repository.RestaurantOwnerRepository;
+import mk.ukim.finki.easyfood.service.RestaurantOwnerService;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalTime;
+
+@Service
+public class RestaurantOwnerServiceImpl implements RestaurantOwnerService {
+
+
+}
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/UserServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/UserServiceImpl.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/UserServiceImpl.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -3,4 +3,6 @@
 import mk.ukim.finki.easyfood.model.AppUser;
 import mk.ukim.finki.easyfood.model.Customer;
+import mk.ukim.finki.easyfood.model.DeliveryMan;
+import mk.ukim.finki.easyfood.model.RestaurantOwner;
 import mk.ukim.finki.easyfood.model.enumerations.ROLE;
 import mk.ukim.finki.easyfood.model.exceptions.InvalidArgumentsException;
@@ -9,4 +11,6 @@
 import mk.ukim.finki.easyfood.repository.AppUserRepository;
 import mk.ukim.finki.easyfood.repository.CustomerRepository;
+import mk.ukim.finki.easyfood.repository.DeliveryManRepository;
+import mk.ukim.finki.easyfood.repository.RestaurantOwnerRepository;
 import mk.ukim.finki.easyfood.service.UserService;
 import org.springframework.stereotype.Service;
@@ -21,11 +25,40 @@
     private final PasswordEncoder passwordEncoder;
     private final CustomerRepository customerRepository;
+    private final RestaurantOwnerRepository restaurantOwnerRepository;
+    private final DeliveryManRepository deliveryManRepository;
 
-    public UserServiceImpl(AppUserRepository appUserRepository, PasswordEncoder passwordEncoder, CustomerRepository customerRepository) {
+    public UserServiceImpl(AppUserRepository appUserRepository, PasswordEncoder passwordEncoder,
+                           CustomerRepository customerRepository, RestaurantOwnerRepository restaurantOwnerRepository,
+                           DeliveryManRepository deliveryManRepository) {
         this.userRepository = appUserRepository;
         this.passwordEncoder = passwordEncoder;
         this.customerRepository = customerRepository;
+        this.restaurantOwnerRepository = restaurantOwnerRepository;
+        this.deliveryManRepository = deliveryManRepository;
     }
 
+    private void validateCommonFields(String fullName, String email, String phoneNumber, String password, String repeatPassword) {
+        if (fullName == null || fullName.isEmpty() ||
+                email == null || email.isEmpty() ||
+                phoneNumber == null || phoneNumber.isEmpty() ||
+                password == null || password.isEmpty()) {
+            throw new InvalidArgumentsException();
+        }
+
+        if (!password.equals(repeatPassword)) {
+            throw new PasswordsDoNotMatchException();
+        }
+
+        if (this.userRepository.findByEmail(email).isPresent()) {
+            throw new UsernameAlreadyExistsException(email);
+        }
+    }
+
+    private String[] parseFullName(String fullName) {
+        String[] nameParts = fullName.trim().split("\\s+", 2);
+        String firstName = nameParts[0];
+        String lastName = nameParts.length > 1 ? nameParts[1] : "";
+        return new String[]{firstName, lastName};
+    }
 
     @Override
@@ -72,3 +105,53 @@
         return userRepository.save(customer);
     }
+
+    @Override
+    public DeliveryMan registerDeliveryMan(String fullName, String email, String phoneNumber,
+                                           String password, String repeatPassword) {
+        return (DeliveryMan) registerUserWithRole(fullName, email, phoneNumber, password, repeatPassword, ROLE.DELIVERY_MAN);
+    }
+
+    @Override
+    public DeliveryMan getDeliveryManById(Long id) {
+        return deliveryManRepository.findById(id)
+                .orElseThrow(() -> new RuntimeException("Delivery man not found with id: " + id));
+    }
+
+    @Override
+    public Optional<DeliveryMan> findDeliveryManByEmail(String email) {
+        return deliveryManRepository.findByEmail(email);
+    }
+
+    @Override
+    public DeliveryMan save(DeliveryMan deliveryMan) {
+        return userRepository.save(deliveryMan);
+    }
+
+    @Override
+    public AppUser registerUserWithRole(String fullName, String email, String phoneNumber,
+                                        String password, String repeatPassword, ROLE role) {
+        validateCommonFields(fullName, email, phoneNumber, password, repeatPassword);
+
+        String[] names = parseFullName(fullName);
+        String firstName = names[0];
+        String lastName = names[1];
+        String encodedPassword = passwordEncoder.encode(password);
+
+        AppUser user;
+        switch (role) {
+            case CUSTOMER:
+                user = new Customer(email, encodedPassword, firstName, lastName, phoneNumber, ROLE.CUSTOMER);
+                break;
+            case RESTAURANT_OWNER:
+                user = new RestaurantOwner(email, encodedPassword, firstName, lastName, phoneNumber, ROLE.RESTAURANT_OWNER);
+                break;
+            case DELIVERY_MAN:
+                user = new DeliveryMan(email, encodedPassword, firstName, lastName, phoneNumber, ROLE.DELIVERY_MAN);
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid role: " + role);
+        }
+
+        return userRepository.save(user);
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/web/controller/AdminRegisterController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/AdminRegisterController.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/AdminRegisterController.java	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -0,0 +1,60 @@
+package mk.ukim.finki.easyfood.web.controller;
+
+import mk.ukim.finki.easyfood.model.enumerations.ROLE;
+import mk.ukim.finki.easyfood.service.UserService;
+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.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+
+@Controller
+@RequestMapping("/admin/register")
+public class AdminRegisterController {
+    private final UserService userService;
+
+    public AdminRegisterController(UserService userService) {
+        this.userService = userService;
+    }
+
+    @GetMapping
+    public String getAdminRegisterPage(@RequestParam(value = "error", required = false) String error,
+                                       @RequestParam(value = "success", required = false) String success,
+                                       Model model) {
+        if (error != null) {
+            model.addAttribute("error", error);
+        }
+        if (success != null) {
+            model.addAttribute("success", success);
+        }
+
+        model.addAttribute("roles", Arrays.asList(ROLE.values()));
+
+        return "admin_register";
+    }
+
+    @PostMapping
+    public String adminRegister(@RequestParam String fullName,
+                                @RequestParam String email,
+                                @RequestParam String phoneNumber,
+                                @RequestParam String password,
+                                @RequestParam String repeatedPassword,
+                                @RequestParam ROLE role) {
+        try {
+            this.userService.registerUserWithRole(fullName, email, phoneNumber, password, repeatedPassword, role);
+
+            String successMsg = URLEncoder.encode("Successfully registered " +
+                            role.toString().toLowerCase().replace("_", " ") + ": " + fullName,
+                    StandardCharsets.UTF_8);
+            return "redirect:/admin/register?success=" + successMsg;
+        } catch (RuntimeException ex) {
+            String errorMsg = URLEncoder.encode(ex.getMessage(), StandardCharsets.UTF_8);
+            return "redirect:/admin/register?error=" + errorMsg;
+        }
+    }
+}
Index: c/main/java/mk/ukim/finki/easyfood/web/controller/RestaurantOwnerController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/RestaurantOwnerController.java	(revision 6d60bed3e3b95ed8edb6b30a1bc52eb1316779e8)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package mk.ukim.finki.easyfood.web.controller;
-
-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
-public class RestaurantOwnerController {
-
-    @GetMapping("/ownerLogin")
-    public String getOwnerLoginPage(Model model) {
-        return "login";
-    }
-
-    @GetMapping("/ownerPage")
-    public String getOwnerDashboard(Model model) {
-        return "restaurant_owner_dashboard";
-    }
-}
Index: src/main/resources/templates/admin_register.html
===================================================================
--- src/main/resources/templates/admin_register.html	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
+++ src/main/resources/templates/admin_register.html	(revision 01114642c04bc80550f138c9b451c661ebdfdaca)
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Admin - Register User</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body class="bg-light">
+<div class="container mt-5">
+    <div class="row justify-content-center">
+        <div class="col-md-6">
+            <div class="card shadow">
+                <div class="card-header bg-primary text-white text-center">
+                    <h3>Admin - Register New User</h3>
+                </div>
+                <div class="card-body">
+                    <!-- Success Message -->
+                    <div th:if="${success}" class="alert alert-success" role="alert">
+                        <span th:text="${success}"></span>
+                    </div>
+
+                    <!-- Error Message -->
+                    <div th:if="${error}" class="alert alert-danger" role="alert">
+                        <span th:text="${error}"></span>
+                    </div>
+
+                    <form th:action="@{/admin/register}" method="post">
+                        <div class="mb-3">
+                            <label for="fullName" class="form-label">Full Name <span class="text-danger">*</span></label>
+                            <input type="text" class="form-control" id="fullName" name="fullName"
+                                   placeholder="Enter full name" required>
+                        </div>
+
+                        <div class="mb-3">
+                            <label for="email" class="form-label">Email <span class="text-danger">*</span></label>
+                            <input type="email" class="form-control" id="email" name="email"
+                                   placeholder="Enter email address" required>
+                        </div>
+
+                        <div class="mb-3">
+                            <label for="phoneNumber" class="form-label">Phone Number <span class="text-danger">*</span></label>
+                            <input type="tel" class="form-control" id="phoneNumber" name="phoneNumber"
+                                   placeholder="Enter phone number" required>
+                        </div>
+
+                        <div class="mb-3">
+                            <label for="role" class="form-label">Role <span class="text-danger">*</span></label>
+                            <select class="form-select" id="role" name="role" required>
+                                <option value="">Select Role</option>
+                                <option th:each="role : ${roles}"
+                                        th:value="${role.name()}"
+                                        th:text="${role.name()}">
+                                </option>
+                            </select>
+                        </div>
+
+                        <div class="row">
+                            <div class="col-md-6">
+                                <div class="mb-3">
+                                    <label for="password" class="form-label">Password <span class="text-danger">*</span></label>
+                                    <input type="password" class="form-control" id="password" name="password"
+                                           placeholder="Enter password" required>
+                                </div>
+                            </div>
+                            <div class="col-md-6">
+                                <div class="mb-3">
+                                    <label for="repeatedPassword" class="form-label">Confirm Password <span class="text-danger">*</span></label>
+                                    <input type="password" class="form-control" id="repeatedPassword" name="repeatedPassword"
+                                           placeholder="Confirm password" required>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="d-grid gap-2">
+                            <button type="submit" class="btn btn-primary btn-lg">Register User</button>
+                        </div>
+                    </form>
+
+                    <div class="text-center mt-3">
+                        <a href="/admin" class="btn btn-secondary">Back to Admin Panel</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
