Index: pom.xml
===================================================================
--- pom.xml	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ pom.xml	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -64,4 +64,10 @@
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.thymeleaf.extras</groupId>
+            <artifactId>thymeleaf-extras-springsecurity6</artifactId>
+            <version>3.1.2.RELEASE</version>
+        </dependency>
+
     </dependencies>
 
Index: src/main/java/mk/ukim/finki/easyfood/config/SecurityConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/config/SecurityConfig.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/config/SecurityConfig.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -1,21 +1,61 @@
 package mk.ukim.finki.easyfood.config;
 
+import mk.ukim.finki.easyfood.service.impl.UserDetailsServiceImpl;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.context.annotation.Bean;
 
 @Configuration
+@EnableWebSecurity
 public class SecurityConfig {
 
+    private final UserDetailsServiceImpl userDetailsService;
+    private final PasswordEncoder passwordEncoder;
+
+    public SecurityConfig(UserDetailsServiceImpl userDetailsService, PasswordEncoder passwordEncoder) {
+        this.userDetailsService = userDetailsService;
+        this.passwordEncoder = passwordEncoder;
+    }
+
     @Bean
-    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+    public DaoAuthenticationProvider authenticationProvider() {
+        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
+        authProvider.setUserDetailsService(userDetailsService);
+        authProvider.setPasswordEncoder(passwordEncoder);
+        return authProvider;
+    }
+
+    @Bean
+    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
         http
-                .csrf(AbstractHttpConfigurer::disable)
-                .authorizeHttpRequests((requests) -> requests
-                        .requestMatchers("/**")
+                .authenticationProvider(authenticationProvider())
+                .authorizeHttpRequests(authz -> authz
+                        .requestMatchers("/login", "/register", "/css/**", "/js/**", "/images/**", "/error", "/home", "/").permitAll()
+                        .anyRequest().authenticated()
+                )
+                .formLogin(form -> form
+                        .loginPage("/login")
+                        .loginProcessingUrl("/login")
+                        .usernameParameter("email")
+                        .passwordParameter("password")
+                        .defaultSuccessUrl("/home", true)
+                        .failureUrl("/login?error=true")
                         .permitAll()
+                )
+                .logout(logout -> logout
+                        .logoutSuccessUrl("/login?logout=true")
+                        .invalidateHttpSession(true)
+                        .deleteCookies("JSESSIONID")
+                        .permitAll()
+                )
+                .sessionManagement(session -> session
+                        .maximumSessions(1)
+                        .maxSessionsPreventsLogin(false)
                 );
+
         return http.build();
     }
Index: src/main/java/mk/ukim/finki/easyfood/model/Address.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/Address.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/model/Address.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -37,3 +37,50 @@
     }
 
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getStreet() {
+        return street;
+    }
+
+    public void setStreet(String street) {
+        this.street = street;
+    }
+
+    public String getPostalCode() {
+        return postalCode;
+    }
+
+    public void setPostalCode(String postalCode) {
+        this.postalCode = postalCode;
+    }
+
+    public List<Order> getOrders() {
+        return orders;
+    }
+
+    public void setOrders(List<Order> orders) {
+        this.orders = orders;
+    }
+
+    public List<AppUser> getUsers() {
+        return users;
+    }
+
+    public void setUsers(List<AppUser> users) {
+        this.users = users;
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/model/AppUser.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/AppUser.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/model/AppUser.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -39,5 +39,5 @@
     private ROLE role;
 
-    @ManyToMany
+    @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(
             name = "user_addresses",
@@ -58,4 +58,3 @@
 
 
-
 }
Index: src/main/java/mk/ukim/finki/easyfood/model/CartItems.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/CartItems.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/model/CartItems.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -30,3 +30,15 @@
         return quantity;
     }
+
+    public void setCart(ShoppingCart cart) {
+        this.cart = cart;
+    }
+
+    public void setItem(Item item) {
+        this.item = item;
+    }
+
+    public void setQuantity(Integer quantity) {
+        this.quantity = quantity;
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/model/Menu.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/Menu.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/model/Menu.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
Index: src/main/java/mk/ukim/finki/easyfood/model/MenuItem.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/MenuItem.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/model/MenuItem.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -28,3 +28,16 @@
         return item;
     }
+
+
+    public Menu getMenu() {
+        return menu;
+    }
+
+    public void setMenu(Menu menu) {
+        this.menu = menu;
+    }
+
+    public void setItem(Item item) {
+        this.item = item;
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/model/Restaurant.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/Restaurant.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/model/Restaurant.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -44,6 +44,4 @@
     private String phoneNumber;
 
-
-    // getters and setters
 
     public Long getId() {
Index: src/main/java/mk/ukim/finki/easyfood/model/ShoppingCart.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/ShoppingCart.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/model/ShoppingCart.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -3,4 +3,5 @@
 import jakarta.persistence.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
@@ -15,12 +16,17 @@
 
     @OneToOne
-    @JoinColumn(name = "customer_id") // foreign key column
+    @JoinColumn(name = "user_id")
     private Customer customer;
 
     @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, orphanRemoval = true)
-    private List<CartItems> cartItems;
+    private List<CartItems> cartItems = new ArrayList<>();
 
-    public List<CartItems> getCartItems() {
-        return cartItems;
+    public ShoppingCart() {
+        this.cartItems = new ArrayList<>();
+    }
+
+    public ShoppingCart(Customer customer) {
+        this.customer = customer;
+        this.cartItems = new ArrayList<>();
     }
 
@@ -28,3 +34,26 @@
         this.cartItems = cartItems;
     }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public void setCustomer(Customer customer) {
+        this.customer = customer;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public Customer getCustomer() {
+        return customer;
+    }
+
+    public List<CartItems> getCartItems() {
+        if (cartItems == null) {
+            cartItems = new ArrayList<>();
+        }
+        return cartItems;
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/model/exceptions/ItemNotFoundException.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/exceptions/ItemNotFoundException.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/model/exceptions/ItemNotFoundException.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.easyfood.model.exceptions;
+
+public class ItemNotFoundException extends RuntimeException{
+    public ItemNotFoundException(Long itemId) {
+        super(String.format("Item with id %d does not exist.", itemId));
+    }
+}
Index: src/main/java/mk/ukim/finki/easyfood/model/exceptions/MenuNotFoundException.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/exceptions/MenuNotFoundException.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/model/exceptions/MenuNotFoundException.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.easyfood.model.exceptions;
+
+public class MenuNotFoundException extends RuntimeException {
+    public MenuNotFoundException(Long menuId) {
+        super(String.format("Menu with id %d does not exist.", menuId));
+    }
+}
Index: src/main/java/mk/ukim/finki/easyfood/model/exceptions/UserNotFoundException.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/model/exceptions/UserNotFoundException.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/model/exceptions/UserNotFoundException.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.easyfood.model.exceptions;
+
+
+public class UserNotFoundException extends RuntimeException {
+    public UserNotFoundException(String email) {
+        super(String.format("User with email %s does not exist.", email));
+    }
+}
Index: src/main/java/mk/ukim/finki/easyfood/repository/AddressRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/AddressRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/AddressRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -3,7 +3,16 @@
 import mk.ukim.finki.easyfood.model.Address;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
+
+import java.util.List;
 
 @Repository
 public interface AddressRepository extends JpaRepository<Address, Long> {
+    List<Address> findAllById(Long id);
+
+    @Query("SELECT a FROM Address a JOIN a.users u WHERE u.id = :userId")
+    List<Address> findAllByUserId(@Param("userId") Long userId);
+
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/CartItemsRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/CartItemsRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/CartItemsRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,10 +2,17 @@
 
 import mk.ukim.finki.easyfood.model.CartItems;
+import mk.ukim.finki.easyfood.model.Customer;
+import mk.ukim.finki.easyfood.model.Item;
 import mk.ukim.finki.easyfood.model.ShoppingCart;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
+
 
 @Repository
 public interface CartItemsRepository extends JpaRepository<CartItems, Long> {
+    Optional<CartItems> findByCartAndItem(ShoppingCart cart, Item item);
+
+    Optional<CartItems> findByCart_CustomerAndItem(Customer customer, Item item);
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/CustomerRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/CustomerRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/CustomerRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -1,9 +1,13 @@
 package mk.ukim.finki.easyfood.repository;
 
+import mk.ukim.finki.easyfood.model.AppUser;
 import mk.ukim.finki.easyfood.model.Customer;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
+
 @Repository
 public interface CustomerRepository extends JpaRepository<Customer, Long> {
+    Optional<Customer> findByEmail(String email);
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/MenuItemRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/MenuItemRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/MenuItemRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -1,4 +1,5 @@
 package mk.ukim.finki.easyfood.repository;
 
+import mk.ukim.finki.easyfood.model.Item;
 import mk.ukim.finki.easyfood.model.Menu;
 import mk.ukim.finki.easyfood.model.MenuItem;
@@ -11,3 +12,4 @@
 public interface MenuItemRepository extends JpaRepository<MenuItem, Long> {
     List<MenuItem> findByMenu(Menu menu);
+    List<MenuItem> findByItem(Item item);
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/MenuRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/MenuRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/MenuRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -6,6 +6,12 @@
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface MenuRepository extends JpaRepository<Menu, Long> {
+
     Menu findByRestaurantId(Long restaurantId);
+
+    List<Menu> findByRestaurant(Restaurant restaurant);
+
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/OrderRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/OrderRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/OrderRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -12,3 +12,4 @@
     List<Order> findAllByDeliveryManAndOrderStatus(DeliveryMan deliveryMan, String orderStatus);
 
+    List<Order> findAllById(Long id);
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/ShoppingCartRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/ShoppingCartRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/ShoppingCartRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -1,5 +1,7 @@
 package mk.ukim.finki.easyfood.repository;
 
+import mk.ukim.finki.easyfood.model.AppUser;
 import mk.ukim.finki.easyfood.model.Customer;
+import mk.ukim.finki.easyfood.model.Item;
 import mk.ukim.finki.easyfood.model.ShoppingCart;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -14,3 +16,8 @@
     Optional<ShoppingCart> findByCustomer(Customer customer);
 
+    default Optional<ShoppingCart> findByCustomerId(Long customerId) {
+        return findAll().stream()
+                .filter(cart -> cart.getCustomer().getId().equals(customerId))
+                .findFirst();
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/repository/UserRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/repository/UserRepository.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/repository/UserRepository.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,4 +2,5 @@
 
 import mk.ukim.finki.easyfood.model.AppUser;
+import mk.ukim.finki.easyfood.model.Customer;
 import org.springframework.stereotype.Repository;
 
@@ -9,3 +10,5 @@
 public interface UserRepository extends JpaSpecificationRepository<AppUser, Long> {
     Optional<AppUser> findByEmailAndPassword(String email, String password);
+
+    Optional<AppUser> findByEmail(String email);
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/AddressService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/AddressService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/service/AddressService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,22 @@
+package mk.ukim.finki.easyfood.service;
+
+import mk.ukim.finki.easyfood.model.Address;
+import mk.ukim.finki.easyfood.model.Customer;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface AddressService {
+    List<Address> findAllByUserId(Long id);
+
+
+    void removeAddressFromUser(Customer customer, Long addressId);
+
+    @Transactional
+    Address addAddressToUser(Customer customer, Address address);
+
+
+    Address findById(Long addressId);
+
+    Address save(Address address);
+}
Index: src/main/java/mk/ukim/finki/easyfood/service/ItemService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/ItemService.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/ItemService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -10,6 +10,10 @@
 public interface ItemService {
     List<Item> findAll();
+
     List<Item> findRecommendedItems();
-   // List<Item> findItemsByRestaurantId(Long restaurantId);
+
+    // List<Item> findItemsByRestaurantId(Long restaurantId);
     public List<Item> getItemsByMenuId(Long menuId);
+
+    Item findById(Long itemId);
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/MenuItemService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/MenuItemService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/service/MenuItemService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.easyfood.service;
+
+import mk.ukim.finki.easyfood.model.Menu;
+import mk.ukim.finki.easyfood.model.MenuItem;
+
+import java.util.List;
+
+public interface MenuItemService {
+    List<MenuItem> findAll();
+
+    List<MenuItem> findByMenu(Menu menu);
+
+    MenuItem createMenuItem(MenuItem menuItem);
+
+    void deleteMenuItem(MenuItem menuItem);
+
+    MenuItem findById(Long id);
+}
+
Index: src/main/java/mk/ukim/finki/easyfood/service/MenuService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/MenuService.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/MenuService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,7 +2,23 @@
 
 import mk.ukim.finki.easyfood.model.Menu;
+import mk.ukim.finki.easyfood.model.Restaurant;
+
+import java.util.List;
+import java.util.Optional;
 
 public interface MenuService {
 
     public Menu getMenuByRestaurantId(Long restaurantId);
+
+    List<Menu> findAll();
+
+    Optional<Menu> findById(Long id);
+
+    Menu createMenu(Menu menu);
+
+    Menu updateMenu(Menu menu);
+
+    void deleteMenu(Long id);
+
+    List<Menu> findByRestaurant(Restaurant restaurant);
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/OrderService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/OrderService.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/OrderService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -8,4 +8,7 @@
 public interface OrderService {
     public List<Order> listOrdersByDeliveryManAndOrderStatus(Long deliveryMan, String orderStatus);
+
     List<Order> listAllOrders();
+
+    List<Order> findAllByUserId(Long id);
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/RestaurantService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/RestaurantService.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/RestaurantService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -4,5 +4,7 @@
 import mk.ukim.finki.easyfood.model.Restaurant;
 
+
 public interface RestaurantService {
     Restaurant findRestaurantById(Long id);
+
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/ShoppingCartService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/ShoppingCartService.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/ShoppingCartService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,4 +2,6 @@
 
 import mk.ukim.finki.easyfood.model.CartItems;
+import mk.ukim.finki.easyfood.model.Customer;
+import mk.ukim.finki.easyfood.model.Item;
 
 import java.math.BigDecimal;
@@ -11,3 +13,14 @@
 
     public BigDecimal totalItemsPrice(Long customerId);
+
+    void addItemToCart(Customer customer, Item item, int quantity);
+
+    List<CartItems> getCartForUser(Long userId);
+
+    void removeItemFromCart(Customer customer, Item item);
+
+    void updateItemQuantity(Customer customer, Item item, int quantity);
+
+    int getNumberOfItemsInCart(Long customerId);
 }
+
Index: src/main/java/mk/ukim/finki/easyfood/service/UserService.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/UserService.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/UserService.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,7 +2,16 @@
 
 import mk.ukim.finki.easyfood.model.AppUser;
+import mk.ukim.finki.easyfood.model.Customer;
+
+import java.util.Optional;
 
 public interface UserService {
     AppUser register(String fullName, String email, String phoneNumber, String password, String repeatPassword);
+
+    Customer getCustomerById(Long id);
+
+    Optional<Customer> findByEmail(String email);
+
+    public Customer save(Customer customer);
 }
 
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/AddressServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/AddressServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/AddressServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,71 @@
+package mk.ukim.finki.easyfood.service.impl;
+
+import mk.ukim.finki.easyfood.model.Address;
+import mk.ukim.finki.easyfood.model.Customer;
+import mk.ukim.finki.easyfood.repository.AddressRepository;
+import mk.ukim.finki.easyfood.repository.CustomerRepository;
+import mk.ukim.finki.easyfood.service.AddressService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+import java.util.List;
+
+@Service
+public class AddressServiceImpl implements AddressService {
+
+    private final AddressRepository addressRepository;
+    private final CustomerRepository customerRepository;
+
+    public AddressServiceImpl(AddressRepository addressRepository, CustomerRepository customerRepository) {
+        this.addressRepository = addressRepository;
+        this.customerRepository = customerRepository;
+    }
+
+    @Override
+    public List<Address> findAllByUserId(Long id) {
+        return this.addressRepository.findAllById(id);
+    }
+
+
+    @Transactional
+    @Override
+    public Address addAddressToUser(Customer customer, Address address) {
+        Address savedAddress = addressRepository.save(address);
+
+        customer.getAddresses().add(savedAddress);
+
+        customerRepository.save(customer);
+
+        return savedAddress;
+    }
+
+    @Override
+    @Transactional
+    public void removeAddressFromUser(Customer customer, Long addressId) {
+        Address addressToRemove = addressRepository.findById(addressId)
+                .orElseThrow(() -> new RuntimeException("Address not found with id: " + addressId));
+
+        customer.getAddresses().removeIf(address -> address.getId().equals(addressId));
+
+        customerRepository.save(customer);
+
+        if (addressToRemove.getUsers() == null || addressToRemove.getUsers().isEmpty() ||
+                (addressToRemove.getUsers().size() == 1 && addressToRemove.getUsers().contains(customer))) {
+            addressRepository.delete(addressToRemove);
+        }
+    }
+
+    @Override
+    public Address findById(Long addressId) {
+        return addressRepository.findById(addressId)
+                .orElseThrow(() -> new RuntimeException("Address not found with id: " + addressId));
+    }
+
+    @Override
+    public Address save(Address address) {
+        return addressRepository.save(address);
+    }
+
+
+}
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/ItemServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/ItemServiceImpl.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/ItemServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -3,4 +3,5 @@
 import mk.ukim.finki.easyfood.model.*;
 
+import mk.ukim.finki.easyfood.model.exceptions.ItemNotFoundException;
 import mk.ukim.finki.easyfood.repository.ItemRepository;
 import mk.ukim.finki.easyfood.repository.MenuItemRepository;
@@ -66,3 +67,8 @@
     }
 
+    @Override
+    public Item findById(Long itemId) {
+        return this.itemRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException(itemId));
+    }
+
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/MenuItemServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/MenuItemServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/MenuItemServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,45 @@
+package mk.ukim.finki.easyfood.service.impl;
+
+import mk.ukim.finki.easyfood.model.Menu;
+import mk.ukim.finki.easyfood.model.MenuItem;
+import mk.ukim.finki.easyfood.model.exceptions.MenuNotFoundException;
+import mk.ukim.finki.easyfood.repository.MenuItemRepository;
+import mk.ukim.finki.easyfood.service.MenuItemService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class MenuItemServiceImpl implements MenuItemService {
+
+    private final MenuItemRepository menuItemRepository;
+
+    public MenuItemServiceImpl(MenuItemRepository menuItemRepository) {
+        this.menuItemRepository = menuItemRepository;
+    }
+
+    @Override
+    public List<MenuItem> findAll() {
+        return menuItemRepository.findAll();
+    }
+
+    @Override
+    public List<MenuItem> findByMenu(Menu menu) {
+        return menuItemRepository.findByMenu(menu);
+    }
+
+    @Override
+    public MenuItem createMenuItem(MenuItem menuItem) {
+        return menuItemRepository.save(menuItem);
+    }
+
+    @Override
+    public void deleteMenuItem(MenuItem menuItem) {
+        menuItemRepository.delete(menuItem);
+    }
+
+    @Override
+    public MenuItem findById(Long id) {
+        return this.menuItemRepository.findById(id).orElseThrow(() -> new MenuNotFoundException(id));
+    }
+}
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/MenuServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/MenuServiceImpl.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/MenuServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,7 +2,11 @@
 
 import mk.ukim.finki.easyfood.model.Menu;
+import mk.ukim.finki.easyfood.model.Restaurant;
 import mk.ukim.finki.easyfood.repository.MenuRepository;
 import mk.ukim.finki.easyfood.service.MenuService;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
 
 @Service
@@ -18,3 +22,32 @@
     }
 
+    @Override
+    public List<Menu> findAll() {
+        return menuRepository.findAll();
+    }
+
+    @Override
+    public Optional<Menu> findById(Long id) {
+        return menuRepository.findById(id);
+    }
+
+    @Override
+    public Menu createMenu(Menu menu) {
+        return menuRepository.save(menu);
+    }
+
+    @Override
+    public Menu updateMenu(Menu menu) {
+        return menuRepository.save(menu);
+    }
+
+    @Override
+    public void deleteMenu(Long id) {
+        menuRepository.deleteById(id);
+    }
+
+    @Override
+    public List<Menu> findByRestaurant(Restaurant restaurant) {
+        return menuRepository.findByRestaurant(restaurant);
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/OrderServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/OrderServiceImpl.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/OrderServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -24,4 +24,5 @@
         return orderRepository.findAll();
     }
+
     @Override
     public List<Order> listOrdersByDeliveryManAndOrderStatus(Long deliveryMan, String orderStatus) {
@@ -30,3 +31,7 @@
     }
 
+    @Override
+    public List<Order> findAllByUserId(Long id) {
+        return this.orderRepository.findAllById(id);
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/ShoppingCartServiceImp.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/ShoppingCartServiceImp.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/ShoppingCartServiceImp.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -3,49 +3,153 @@
 import mk.ukim.finki.easyfood.model.Customer;
 import mk.ukim.finki.easyfood.model.CartItems;
+import mk.ukim.finki.easyfood.model.Item;
 import mk.ukim.finki.easyfood.model.ShoppingCart;
+import mk.ukim.finki.easyfood.repository.CartItemsRepository;
 import mk.ukim.finki.easyfood.repository.CustomerRepository;
+import mk.ukim.finki.easyfood.repository.ItemRepository;
 import mk.ukim.finki.easyfood.repository.ShoppingCartRepository;
 import mk.ukim.finki.easyfood.service.ShoppingCartService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
 @Service
 public class ShoppingCartServiceImp implements ShoppingCartService {
+
     private final ShoppingCartRepository shoppingCartRepository;
     private final CustomerRepository customerRepository;
+    private final ItemRepository itemRepository;
+    private final CartItemsRepository cartItemsRepository;
 
-    public ShoppingCartServiceImp(ShoppingCartRepository shoppingCartRepository, CustomerRepository customerRepository) {
+    public ShoppingCartServiceImp(ShoppingCartRepository shoppingCartRepository,
+                                  CustomerRepository customerRepository,
+                                  ItemRepository itemRepository,
+                                  CartItemsRepository cartItemsRepository) {
         this.shoppingCartRepository = shoppingCartRepository;
         this.customerRepository = customerRepository;
+        this.itemRepository = itemRepository;
+        this.cartItemsRepository = cartItemsRepository;
+    }
+
+    @Override
+    public List<CartItems> getItemsInCartByCustomerId(Long customerId) {
+        Optional<Customer> customerOpt = customerRepository.findById(customerId);
+        if (customerOpt.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        Customer customer = customerOpt.get();
+        Optional<ShoppingCart> cartOpt = shoppingCartRepository.findByCustomer(customer);
+
+        if (cartOpt.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        ShoppingCart cart = cartOpt.get();
+        List<CartItems> items = cart.getCartItems();
+        return items != null ? items : Collections.emptyList();
+    }
+
+    @Override
+    public BigDecimal totalItemsPrice(Long customerId) {
+        List<CartItems> cartItems = getItemsInCartByCustomerId(customerId);
+        return cartItems.stream()
+                .map(cartItem -> cartItem.getItem().getPrice()
+                        .multiply(BigDecimal.valueOf(cartItem.getQuantity())))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    @Override
+    @Transactional
+    public void addItemToCart(Customer customer, Item item, int quantity) {
+        if (customer == null) {
+            throw new IllegalArgumentException("Customer cannot be null.");
+        }
+
+        ShoppingCart cart = shoppingCartRepository.findByCustomer(customer).orElseGet(() -> {
+            ShoppingCart newCart = new ShoppingCart();
+            newCart.setCustomer(customer);
+            return shoppingCartRepository.save(newCart);
+        });
+
+        if (cart.getCartItems() == null) {
+            cart.setCartItems(new ArrayList<>());
+        }
+
+        Optional<CartItems> existingItem = cartItemsRepository.findByCartAndItem(cart, item);
+
+        if (existingItem.isPresent()) {
+            CartItems cartItem = existingItem.get();
+            cartItem.setQuantity(cartItem.getQuantity() + quantity);
+            cartItemsRepository.save(cartItem);
+        } else {
+            CartItems newCartItem = new CartItems();
+            newCartItem.setCart(cart);
+            newCartItem.setItem(item);
+            newCartItem.setQuantity(quantity);
+            cartItemsRepository.save(newCartItem);
+        }
+    }
+
+    @Override
+    public List<CartItems> getCartForUser(Long userId) {
+        return getItemsInCartByCustomerId(userId);
+    }
+
+    @Override
+    @Transactional
+    public void removeItemFromCart(Customer customer, Item item) {
+        Optional<ShoppingCart> cartOptional = shoppingCartRepository.findByCustomer(customer);
+
+        if (cartOptional.isPresent()) {
+            ShoppingCart cart = cartOptional.get();
+            Optional<CartItems> cartItemOptional = cartItemsRepository.findByCartAndItem(cart, item);
+
+            if (cartItemOptional.isPresent()) {
+                cartItemsRepository.delete(cartItemOptional.get());
+            } else {
+                throw new RuntimeException("Item not found in cart.");
+            }
+        } else {
+            throw new RuntimeException("Cart not found for customer.");
+        }
+    }
+
+    @Override
+    @Transactional
+    public void updateItemQuantity(Customer customer, Item item, int quantity) {
+        if (quantity <= 0) {
+            removeItemFromCart(customer, item);
+        } else {
+            Optional<ShoppingCart> cartOptional = shoppingCartRepository.findByCustomer(customer);
+
+            if (cartOptional.isPresent()) {
+                ShoppingCart cart = cartOptional.get();
+                Optional<CartItems> cartItemOptional = cartItemsRepository.findByCartAndItem(cart, item);
+
+                if (cartItemOptional.isPresent()) {
+                    CartItems cartItem = cartItemOptional.get();
+                    cartItem.setQuantity(quantity);
+                    cartItemsRepository.save(cartItem);
+                } else {
+                    throw new RuntimeException("Item not found in cart.");
+                }
+            } else {
+                throw new RuntimeException("Cart not found for customer.");
+            }
+        }
     }
 
 
     @Override
-    public List<CartItems> getItemsInCartByCustomerId(Long customerId) {
-        Customer customer = customerRepository.findById(customerId).orElse(null);
-
-
-        // Find the shopping cart associated with the customer.
-        return shoppingCartRepository.findByCustomer(customer)
-                .map(ShoppingCart::getCartItems)
-                .orElse(Collections.emptyList());
+    public int getNumberOfItemsInCart(Long customerId) {
+        return getItemsInCartByCustomerId(customerId).stream()
+                .mapToInt(CartItems::getQuantity)
+                .sum();
     }
-
-    @Override
-    public BigDecimal totalItemsPrice(Long customerId) {
-        // Retrieve the list of CartItems for the given customer.
-        List<CartItems> cartItems = getItemsInCartByCustomerId(customerId);
-
-        // Use a stream to calculate the total price.
-        return cartItems.stream()
-                // Map each CartItems object to its calculated subtotal.
-                .map(cartItem -> cartItem.getItem().getPrice().multiply(BigDecimal.valueOf(cartItem.getQuantity())))
-                // Reduce the stream to a single BigDecimal value by summing up all subtotals.
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-    }
-
-
 }
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/UserDetailsServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/UserDetailsServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/UserDetailsServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,42 @@
+package mk.ukim.finki.easyfood.service.impl;
+
+import mk.ukim.finki.easyfood.model.AppUser;
+import mk.ukim.finki.easyfood.repository.AppUserRepository;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService; // SPRING SECURITY INTERFACE
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+
+@Service
+public class UserDetailsServiceImpl implements UserDetailsService {
+
+    private final AppUserRepository userRepository;
+
+    public UserDetailsServiceImpl(AppUserRepository userRepository) {
+        this.userRepository = userRepository;
+    }
+
+    @Override
+    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
+
+        AppUser user = userRepository.findByEmail(email)
+                .orElseThrow(() -> {
+                    return new UsernameNotFoundException("User not found with email: " + email);
+                });
+
+        return User.builder()
+                .username(user.getEmail())
+                .password(user.getPassword())
+                .authorities(Collections.singletonList(
+                        new SimpleGrantedAuthority("ROLE_" + user.getRole().name())))
+                .accountExpired(false)
+                .accountLocked(false)
+                .credentialsExpired(false)
+                .disabled(false)
+                .build();
+    }
+}
Index: src/main/java/mk/ukim/finki/easyfood/service/impl/UserServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/service/impl/UserServiceImpl.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/service/impl/UserServiceImpl.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -8,7 +8,10 @@
 import mk.ukim.finki.easyfood.model.exceptions.UsernameAlreadyExistsException;
 import mk.ukim.finki.easyfood.repository.AppUserRepository;
+import mk.ukim.finki.easyfood.repository.CustomerRepository;
 import mk.ukim.finki.easyfood.service.UserService;
 import org.springframework.stereotype.Service;
 import org.springframework.security.crypto.password.PasswordEncoder;
+
+import java.util.Optional;
 
 @Service
@@ -17,8 +20,10 @@
     private final AppUserRepository userRepository;
     private final PasswordEncoder passwordEncoder;
+    private final CustomerRepository customerRepository;
 
-    public UserServiceImpl(AppUserRepository appUserRepository, PasswordEncoder passwordEncoder) {
+    public UserServiceImpl(AppUserRepository appUserRepository, PasswordEncoder passwordEncoder, CustomerRepository customerRepository) {
         this.userRepository = appUserRepository;
         this.passwordEncoder = passwordEncoder;
+        this.customerRepository = customerRepository;
     }
 
@@ -50,3 +55,20 @@
         return userRepository.save(customer);
     }
+
+    @Override
+    public Customer getCustomerById(Long id) {
+        return customerRepository.findById(id)
+                .orElseThrow(() -> new RuntimeException("Customer not found with id: " + id));
+    }
+
+
+    @Override
+    public Optional<Customer> findByEmail(String email) {
+        return customerRepository.findByEmail(email);
+    }
+
+    @Override
+    public Customer save(Customer customer) {
+        return userRepository.save(customer);
+    }
 }
Index: src/main/java/mk/ukim/finki/easyfood/web/controller/HomeController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/HomeController.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/HomeController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,7 +2,10 @@
 
 import mk.ukim.finki.easyfood.model.Category;
+import mk.ukim.finki.easyfood.model.Customer;
 import mk.ukim.finki.easyfood.model.Item;
 import mk.ukim.finki.easyfood.service.CategoryService;
 import mk.ukim.finki.easyfood.service.ItemService;
+import mk.ukim.finki.easyfood.service.ShoppingCartService;
+import org.springframework.security.core.Authentication;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -13,23 +16,20 @@
 
 @Controller
-@RequestMapping(path = {"/", "", "/home"})
+@RequestMapping(path = {"/", "/home"})
 public class HomeController {
 
     private final CategoryService categoryService;
     private final ItemService itemService;
+    private final ShoppingCartService shoppingCartService;
 
-    public HomeController(CategoryService categoryService, ItemService itemService) {
+    public HomeController(CategoryService categoryService, ItemService itemService, ShoppingCartService shoppingCartService) {
         this.categoryService = categoryService;
         this.itemService = itemService;
+        this.shoppingCartService = shoppingCartService;
     }
 
-//    @GetMapping
-//    public String getHomePage(Model model) {
-//        model.addAttribute("bodyContent", "home");
-//        return "main_pg";
-//    }
 
-    @GetMapping("/")
-    public String getHomePage(Model model) {
+    @GetMapping()
+    public String getHomePage(Model model, Authentication authentication) {
         List<Category> categories = categoryService.listCategories();
         List<Item> items = itemService.findAll();
@@ -38,4 +38,19 @@
         model.addAttribute("items", items);
         model.addAttribute("recommendedItems", recommendedItems);
+
+
+        Long userId = null;
+        if (authentication != null && authentication.getPrincipal() instanceof Customer) {
+            Customer customer = (Customer) authentication.getPrincipal();
+            userId = customer.getId();
+        }
+
+        int numberOfItems = 0;
+        if (userId != null) {
+            numberOfItems = shoppingCartService.getNumberOfItemsInCart(userId);
+        }
+
+        model.addAttribute("numberOfItems", numberOfItems);
+
         return "main_pg";
     }
Index: src/main/java/mk/ukim/finki/easyfood/web/controller/LoginController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/LoginController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/LoginController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,28 @@
+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.RequestParam;
+
+
+@Controller
+public class LoginController {
+
+    @GetMapping("/login")
+    public String getLoginPage(@RequestParam(value = "error", required = false) String error,
+                               @RequestParam(value = "logout", required = false) String logout,
+                               @RequestParam(value = "registered", required = false) String registered,
+                               Model model) {
+        if (error != null) {
+            model.addAttribute("error", "Invalid email or password");
+        }
+        if (logout != null) {
+            model.addAttribute("message", "You have been logged out successfully");
+        }
+        if (registered != null) {
+            model.addAttribute("message", "Registration successful! Please login.");
+        }
+        return "login";
+    }
+}
Index: src/main/java/mk/ukim/finki/easyfood/web/controller/MenuController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/MenuController.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/MenuController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
Index: src/main/java/mk/ukim/finki/easyfood/web/controller/ProfileController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/ProfileController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/ProfileController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,169 @@
+package mk.ukim.finki.easyfood.web.controller;
+
+import mk.ukim.finki.easyfood.model.Customer;
+import mk.ukim.finki.easyfood.model.Address;
+import mk.ukim.finki.easyfood.model.Order;
+import mk.ukim.finki.easyfood.service.UserService;
+import mk.ukim.finki.easyfood.service.AddressService;
+import mk.ukim.finki.easyfood.service.OrderService;
+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;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+
+import java.util.List;
+import java.util.Optional;
+
+@Controller
+@RequestMapping("/profile")
+public class ProfileController {
+
+    private final UserService userService;
+    private final AddressService addressService;
+    private final OrderService orderService;
+
+    public ProfileController(UserService userService, AddressService addressService, OrderService orderService) {
+        this.userService = userService;
+        this.addressService = addressService;
+        this.orderService = orderService;
+    }
+
+    @GetMapping
+    public String getProfileDashboard(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        if (authentication != null && authentication.isAuthenticated()
+                && !authentication.getName().equals("anonymousUser")) {
+
+            String email = authentication.getName();
+
+            Optional<Customer> customerOptional = userService.findByEmail(email);
+
+            if (customerOptional.isPresent()) {
+                Customer customer = customerOptional.get();
+
+                List<Order> orders = orderService.findAllByUserId(customer.getId());
+                List<Address> addresses = customer.getAddresses();
+                model.addAttribute("user", customer);
+                model.addAttribute("addresses", addresses);
+                model.addAttribute("orders", orders);
+                return "profile";
+            }
+        }
+
+        return "redirect:/login";
+    }
+
+    @PostMapping("/address/add")
+    public String addAddress(@RequestParam String street,
+                             @RequestParam String city,
+                             @RequestParam String postalCode,
+                             RedirectAttributes redirectAttributes) {
+
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        if (authentication != null && authentication.isAuthenticated()
+                && !authentication.getName().equals("anonymousUser")) {
+
+            String email = authentication.getName();
+            Optional<Customer> customerOptional = userService.findByEmail(email);
+
+            if (customerOptional.isPresent()) {
+                Customer customer = customerOptional.get();
+
+                try {
+                    Address address = new Address();
+                    address.setStreet(street);
+                    address.setCity(city);
+                    address.setPostalCode(postalCode);
+
+                    addressService.addAddressToUser(customer, address);
+
+                    redirectAttributes.addFlashAttribute("successMessage",
+                            "Address added successfully!");
+                } catch (Exception e) {
+                    redirectAttributes.addFlashAttribute("errorMessage",
+                            "Failed to add address. Please try again.");
+                }
+
+                return "redirect:/profile#addresses";
+            }
+        }
+
+        return "redirect:/login";
+    }
+
+    @PostMapping("/address/delete")
+    public String deleteAddress(@RequestParam Long addressId,
+                                RedirectAttributes redirectAttributes) {
+
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        if (authentication != null && authentication.isAuthenticated()
+                && !authentication.getName().equals("anonymousUser")) {
+
+            String email = authentication.getName();
+            Optional<Customer> customerOptional = userService.findByEmail(email);
+
+            if (customerOptional.isPresent()) {
+                Customer customer = customerOptional.get();
+
+                try {
+                    addressService.removeAddressFromUser(customer, addressId);
+                    redirectAttributes.addFlashAttribute("successMessage",
+                            "Address deleted successfully!");
+                } catch (Exception e) {
+                    redirectAttributes.addFlashAttribute("errorMessage",
+                            "Failed to delete address. Please try again.");
+                }
+
+                return "redirect:/profile#addresses";
+            }
+        }
+
+        return "redirect:/login";
+    }
+
+    @PostMapping("/update")
+    public String updateUserDetails(@RequestParam String firstName,
+                                    @RequestParam String lastName,
+                                    @RequestParam String email,
+                                    @RequestParam String phone,
+                                    RedirectAttributes redirectAttributes) {
+
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        if (authentication != null && authentication.isAuthenticated()
+                && !authentication.getName().equals("anonymousUser")) {
+
+            String currentEmail = authentication.getName();
+            Optional<Customer> customerOptional = userService.findByEmail(currentEmail);
+
+            if (customerOptional.isPresent()) {
+                Customer customer = customerOptional.get();
+                try {
+                    customer.setFirstName(firstName);
+                    customer.setLastName(lastName);
+                    customer.setEmail(email);
+                    customer.setPhone(phone);
+
+                    userService.save(customer);
+
+                    redirectAttributes.addFlashAttribute("successMessage",
+                            "Profile updated successfully!");
+                } catch (Exception e) {
+                    redirectAttributes.addFlashAttribute("errorMessage",
+                            "Failed to update profile. Please try again.");
+                }
+                return "redirect:/profile#details";
+            }
+        }
+        return "redirect:/login";
+    }
+}
Index: src/main/java/mk/ukim/finki/easyfood/web/controller/RegisterController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/RegisterController.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/RegisterController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -22,6 +22,9 @@
 
     @GetMapping
-    public String getRegisterPage() {
-        return "registe_customer";
+    public String getRegisterPage(@RequestParam(value = "error", required = false) String error, Model model) {
+        if (error != null) {
+            model.addAttribute("error", error);
+        }
+        return "register_customer";
     }
 
@@ -34,5 +37,5 @@
         try {
             this.userService.register(fullName, email, phoneNumber, password, repeatedPassword);
-            return "redirect:/home";
+            return "redirect:/login?registered";
         } catch (RuntimeException ex) {
             String errorMsg = URLEncoder.encode(ex.getMessage(), StandardCharsets.UTF_8);
@@ -41,4 +44,2 @@
     }
 }
-
-
Index: src/main/java/mk/ukim/finki/easyfood/web/controller/RestaurantOwnerController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/RestaurantOwnerController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/RestaurantOwnerController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,20 @@
+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/java/mk/ukim/finki/easyfood/web/controller/ShoppingCartController.java
===================================================================
--- src/main/java/mk/ukim/finki/easyfood/web/controller/ShoppingCartController.java	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/java/mk/ukim/finki/easyfood/web/controller/ShoppingCartController.java	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -1,32 +1,117 @@
 package mk.ukim.finki.easyfood.web.controller;
 
+import mk.ukim.finki.easyfood.model.AppUser;
+import mk.ukim.finki.easyfood.model.Customer;
 import mk.ukim.finki.easyfood.model.CartItems;
 import mk.ukim.finki.easyfood.model.Item;
+import mk.ukim.finki.easyfood.service.ItemService;
 import mk.ukim.finki.easyfood.service.ShoppingCartService;
+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.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.security.core.Authentication;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Optional;
 
 @Controller
-@RequestMapping("/shoppingCart")
+@RequestMapping("/cart")
 public class ShoppingCartController {
+
     private final ShoppingCartService shoppingCartService;
+    private final UserService userService;
+    private final ItemService itemService;
 
-    public ShoppingCartController(ShoppingCartService shoppingCartService) {
+    public ShoppingCartController(ShoppingCartService shoppingCartService,
+                                  UserService userService,
+                                  ItemService itemService) {
         this.shoppingCartService = shoppingCartService;
+        this.userService = userService;
+        this.itemService = itemService;
     }
 
-    @GetMapping("/{id}")
-    public String shoppingCart(@PathVariable("id") Long id, Model model) {
-        List<CartItems> items= shoppingCartService.getItemsInCartByCustomerId(id);
-        BigDecimal total = shoppingCartService.totalItemsPrice(id);
-        model.addAttribute("items", items);
+    @GetMapping
+    public String showCart(Model model, Authentication authentication) {
+        if (authentication == null || !authentication.isAuthenticated()) {
+            return "redirect:/login";
+        }
+
+        String userEmail = authentication.getName();
+        Optional<Customer> customerOptional = userService.findByEmail(userEmail);
+
+        if (customerOptional.isEmpty()) {
+            return "redirect:/login";
+        }
+
+        Customer customer = customerOptional.get();
+        List<CartItems> items = shoppingCartService.getItemsInCartByCustomerId(customer.getId());
+        BigDecimal total = shoppingCartService.totalItemsPrice(customer.getId());
+
+        model.addAttribute("cartItems", items);
         model.addAttribute("total", total);
+
         return "shopping_cart";
     }
+
+    @PostMapping("/add")
+    public String addToCart(@RequestParam Long itemId, Authentication authentication) {
+        if (authentication == null || !authentication.isAuthenticated()) {
+            return "redirect:/login";
+        }
+
+        String userEmail = authentication.getName();
+        AppUser appUser = userService.findByEmail(userEmail)
+                .orElseThrow(() -> new RuntimeException("User not found"));
+
+        if (!(appUser instanceof Customer customer)) {
+            throw new RuntimeException("Only customers can add items to cart.");
+        }
+
+        Item item = itemService.findById(itemId);
+        shoppingCartService.addItemToCart(customer, item, 1);
+
+        return "redirect:/cart";
+    }
+
+    @PostMapping("/remove")
+    public String removeFromCart(@RequestParam Long itemId, Authentication authentication) {
+        if (authentication == null || !authentication.isAuthenticated()) {
+            return "redirect:/login";
+        }
+
+        String userEmail = authentication.getName();
+        AppUser appUser = userService.findByEmail(userEmail)
+                .orElseThrow(() -> new RuntimeException("User not found"));
+
+        if (!(appUser instanceof Customer customer)) {
+            throw new RuntimeException("Only customers can remove items from cart.");
+        }
+
+        Item item = itemService.findById(itemId);
+        shoppingCartService.removeItemFromCart(customer, item);
+
+        return "redirect:/cart";
+    }
+
+    @PostMapping("/update")
+    public String updateCart(@RequestParam Long itemId, @RequestParam int quantity, Authentication authentication) {
+        if (authentication == null || !authentication.isAuthenticated()) {
+            return "redirect:/login";
+        }
+
+        String userEmail = authentication.getName();
+        AppUser appUser = userService.findByEmail(userEmail)
+                .orElseThrow(() -> new RuntimeException("User not found"));
+
+        if (!(appUser instanceof Customer customer)) {
+            throw new RuntimeException("Only customers can update cart items.");
+        }
+
+        Item item = itemService.findById(itemId);
+        shoppingCartService.updateItemQuantity(customer, item, quantity);
+
+        return "redirect:/cart";
+    }
 }
Index: src/main/resources/application.properties
===================================================================
--- src/main/resources/application.properties	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/resources/application.properties	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -4,4 +4,6 @@
 spring.datasource.password=152aa5c9dd3c
 spring.datasource.driver-class-name=org.postgresql.Driver
+server.servlet.session.timeout=1h
 
 
+
Index: src/main/resources/templates/login.html
===================================================================
--- src/main/resources/templates/login.html	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/resources/templates/login.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -1,4 +1,4 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="UTF-8">
@@ -14,18 +14,14 @@
         <!-- Logo -->
         <a class="navbar-brand d-flex align-items-center" href="index.html">
-            <img src="media/easyfood.png" alt="Logo" height="40">
+            <img src="/images/logo.JPG" alt="Logo" height="80">
         </a>
-
-
-
-        <!-- Profile Icon -->
-        <div class="d-flex align-items-center">
-
-        </div>
+        <div class="d-flex align-items-center"></div>
     </div>
 </nav>
 
+<!-- Centering div -->
+<div class="mt-5 d-flex justify-content-center"></div>
 
-<!-- Profile Settings -->
+<!-- Login Form -->
 <div class="container my-5">
     <div class="row justify-content-center">
@@ -36,28 +32,59 @@
                     <h3 class="mb-4 text-center">Login</h3>
 
-                    <!-- Profile Picture -->
+                    <!-- Error Messages -->
+                    <div th:if="${param.error}" class="alert alert-danger text-center mb-3">
+                        <i class="bi bi-exclamation-triangle-fill me-2"></i>
+                        Invalid email or password. Please try again.
+                    </div>
+
+                    <!-- Success Messages -->
+                    <div th:if="${param.logout}" class="alert alert-success text-center mb-3">
+                        <i class="bi bi-check-circle-fill me-2"></i>
+                        You have been logged out successfully.
+                    </div>
+
+                    <!-- Registration Success Message -->
+                    <div th:if="${param.registered}" class="alert alert-success text-center mb-3">
+                        <i class="bi bi-check-circle-fill me-2"></i>
+                        Registration successful! Please login with your credentials.
+                    </div>
+
+                    <!-- Profile Icon -->
                     <div class="text-center mb-4">
                         <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png"
                              class="rounded-circle border shadow-sm"
                              alt="Profile" width="100" height="100">
-
                     </div>
 
-                    <!-- Form -->
-                    <form>
-
+                    <!-- Form - Spring Security will process this -->
+                    <form class="form-signin mt-xl-5" method="post" th:action="@{/login}">
                         <div class="mb-3">
                             <label class="form-label fw-semibold">Email</label>
-                            <input type="email" class="form-control" value="john@example.com">
+                            <input type="email" name="email" class="form-control" placeholder="Enter your email"
+                                   required autofocus>
                         </div>
 
                         <div class="mb-3">
                             <label class="form-label fw-semibold">Password</label>
-                            <input type="password" class="form-control" placeholder="********">
+                            <input type="password" name="password" class="form-control"
+                                   placeholder="Enter your password" required>
                         </div>
 
+                        <!-- Remember Me Option -->
+                        <div class="mb-3 form-check">
+                            <input type="checkbox" name="remember-me" class="form-check-input" id="rememberMe">
+                            <label class="form-check-label" for="rememberMe">
+                                Remember me
+                            </label>
+                        </div>
 
                         <div class="d-flex justify-content-center">
-                            <button type="submit" class="btn btn-warning fw-semibold">login</button>
+                            <button type="submit" class="btn btn-warning fw-semibold px-4">
+                                <i class="bi bi-box-arrow-in-right me-2"></i>Login
+                            </button>
+                        </div>
+
+                        <div class="text-center mt-3">
+                            <small>Don't have an account? <a href="/register" class="text-decoration-none">Register here</a></small>
                         </div>
                     </form>
Index: src/main/resources/templates/main_pg.html
===================================================================
--- src/main/resources/templates/main_pg.html	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/resources/templates/main_pg.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -81,4 +81,51 @@
         }
 
+        /* Cart badge styling */
+        .cart-badge {
+            position: absolute;
+            top: -8px;
+            right: -8px;
+            min-width: 18px;
+            height: 18px;
+            border-radius: 50%;
+            font-size: 11px;
+            font-weight: bold;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            line-height: 1;
+        }
+
+        /* Hide badge when count is 0 */
+        .cart-badge.d-none {
+            display: none !important;
+        }
+
+        .recommended-scroll-items {
+            display: flex;
+            gap: 1rem;
+            overflow-x: auto;
+            padding-bottom: 1rem;
+            scroll-behavior: smooth;
+        }
+
+        .recommended-scroll-items .card {
+            flex: 0 0 auto;
+            width: 14rem;
+            border-radius: 12px;
+            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+            transition: transform 0.2s;
+        }
+
+        .recommended-scroll-items .card:hover {
+            transform: scale(1.05);
+        }
+
+        .recommended-scroll-items img {
+            height: 140px;
+            object-fit: cover;
+            border-top-left-radius: 12px;
+            border-top-right-radius: 12px;
+        }
     </style>
 </head>
@@ -98,7 +145,10 @@
             <a href="cart.html" class="btn btn-outline-secondary rounded-circle p-2 position-relative">
                 <img src="https://cdn-icons-png.flaticon.com/512/1170/1170678.png" alt="Cart" width="22" height="22">
-                <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-warning text-dark">2</span>
+                <!-- Fixed cart badge with proper conditional display -->
+                <span class="cart-badge bg-warning text-dark"
+                      th:classappend="${numberOfItems == 0} ? 'd-none' : ''"
+                      th:text="${numberOfItems}">0</span>
             </a>
-            <a href="profile.html" class="btn btn-outline-secondary rounded-circle p-2">
+            <a href="/profile" class="btn btn-outline-secondary rounded-circle p-2">
                 <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png" alt="Profile" width="22" height="22">
             </a>
@@ -110,5 +160,5 @@
 <div class="text-center my-3">
     <blockquote class="blockquote">
-        <p class="fs-5">“Fresh flavors delivered to your door.”</p>
+        <p class="fs-5">"Fresh flavors delivered to your door."</p>
     </blockquote>
 </div>
@@ -122,4 +172,5 @@
 
 <div id="Recommended" class="container-fluid my-4">
+    <h4 class="mb-3">Featured Items</h4>
     <div class="recommended-scroll">
         <div class="card" th:each="item : ${items}">
@@ -128,5 +179,9 @@
                 <h5 class="card-title" th:text="${item.name}">Item Name</h5>
                 <p class="card-text text-muted" th:text="${item.price} + '$'">Price</p>
-                <a href="#" class="btn btn-warning w-100">Add to cart</a>
+
+                <form th:action="@{/cart/add}" method="post">
+                    <input type="hidden" name="itemId" th:value="${item.id}"/>
+                    <button type="submit" class="btn btn-warning w-100">Add to cart</button>
+                </form>
             </div>
         </div>
@@ -134,6 +189,7 @@
 </div>
 
-
-<div id="RecommendedItems" class="container-fluid my-4">
+<div id="RecommendedItems" class="container-fluid my-4"
+     th:if="${recommendedItems != null and !recommendedItems.isEmpty()}">
+    <h4 class="mb-3">Recommended for You</h4>
     <div class="recommended-scroll-items">
         <div class="card" th:each="item : ${recommendedItems}">
@@ -142,5 +198,9 @@
                 <h5 class="card-title" th:text="${item.name}">Item Name</h5>
                 <p class="card-text text-muted" th:text="${item.price} + '$'">Price</p>
-                <a href="#" class="btn btn-warning w-100">Add to cart</a>
+
+                <form th:action="@{/cart/add}" method="post">
+                    <input type="hidden" name="itemId" th:value="${item.id}"/>
+                    <button type="submit" class="btn btn-warning w-100">Add to cart</button>
+                </form>
             </div>
         </div>
@@ -148,5 +208,4 @@
 </div>
 
-
 </body>
 </html>
Index: src/main/resources/templates/profile.html
===================================================================
--- src/main/resources/templates/profile.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/resources/templates/profile.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,262 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>User Profile Dashboard</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
+          crossorigin="anonymous">
+
+    <script>
+        document.addEventListener('DOMContentLoaded', function () {
+            const editDetailsBtn = document.getElementById('editDetailsBtn');
+            const cancelEditBtn = document.getElementById('cancelEditBtn');
+            const detailsDisplay = document.getElementById('detailsDisplay');
+            const detailsForm = document.getElementById('detailsForm');
+
+            editDetailsBtn.addEventListener('click', function () {
+                detailsDisplay.style.display = 'none';
+                detailsForm.style.display = 'block';
+                editDetailsBtn.style.display = 'none';
+            });
+
+            cancelEditBtn.addEventListener('click', function () {
+                detailsDisplay.style.display = 'block';
+                detailsForm.style.display = 'none';
+                editDetailsBtn.style.display = 'block';
+            });
+        });
+    </script>
+    <style>
+        body {
+            background-color: #f8f9fa;
+        }
+
+        .profile-container {
+            max-width: 800px;
+            margin-top: 50px;
+            padding: 30px;
+            background-color: #ffffff;
+            border-radius: 12px;
+            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+        }
+
+        .profile-header {
+            text-align: center;
+            margin-bottom: 30px;
+        }
+
+        .profile-nav a {
+            color: #d9902e;
+            text-decoration: none;
+            font-weight: bold;
+            transition: color 0.2s;
+        }
+
+        .profile-nav a:hover {
+            color: #f0ad4e;
+        }
+
+        .card-header {
+            background-color: #f0ad4e;
+            color: white;
+            border-bottom: 2px solid #d9902e;
+            border-top-left-radius: 12px;
+            border-top-right-radius: 12px;
+        }
+
+        .list-group-item strong {
+            color: #333;
+        }
+
+        .add-address-btn {
+            background-color: #d9902e;
+            border-color: #d9902e;
+        }
+
+        .add-address-btn:hover {
+            background-color: #f0ad4e;
+            border-color: #f0ad4e;
+        }
+    </style>
+</head>
+<body class="bg-light">
+
+<nav class="navbar bg-body-tertiary shadow-sm">
+    <div class="container-fluid">
+        <a class="navbar-brand d-flex align-items-center" href="/">
+            <img src="/images/logo.JPG" alt="Logo" height="90" class="d-inline-block align-text-top">
+        </a>
+        <form class="d-flex mx-auto w-50" role="search">
+            <input class="form-control me-2" type="search" placeholder="Search for food..." aria-label="Search">
+            <button class="btn btn-warning" type="submit">Search</button>
+        </form>
+        <div class="d-flex align-items-center gap-2">
+            <a href="/cart" class="btn btn-outline-secondary rounded-circle p-2 position-relative">
+                <img src="https://cdn-icons-png.flaticon.com/512/1170/1170678.png" alt="Cart" width="22" height="22">
+                <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-warning text-dark">2</span>
+            </a>
+            <a href="/profile" class="btn btn-outline-secondary rounded-circle p-2">
+                <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png" alt="Profile" width="22" height="22">
+            </a>
+        </div>
+    </div>
+</nav>
+
+<div class="container profile-container">
+    <div class="profile-header">
+        <h1 class="display-4">Welcome, <span th:text="${user.firstName}"></span>!</h1>
+        <hr>
+        <nav class="profile-nav d-flex justify-content-center gap-4">
+            <a href="#details" class="fs-5">View my details</a>
+            <a href="#addresses" class="fs-5">View my addresses</a>
+            <a href="#orders" class="fs-5">View my orders</a>
+        </nav>
+    </div>
+
+    <div id="details" class="card my-4 border-0 shadow">
+        <div class="card-header d-flex justify-content-between align-items-center">
+            <h2 class="h4 mb-0">My Details</h2>
+            <button id="editDetailsBtn" class="btn btn-light btn-sm add-address-btn">Edit</button>
+        </div>
+        <div class="card-body">
+            <div id="detailsDisplay">
+                <ul class="list-group list-group-flush">
+                    <li class="list-group-item"><strong>Full Name:</strong> <span id="fullNameDisplay"
+                                                                                  th:text="${user.firstName} + ' ' + ${user.lastName}"></span>
+                    </li>
+                    <li class="list-group-item"><strong>Email:</strong> <span id="emailDisplay"
+                                                                              th:text="${user.email}"></span>
+                    </li>
+                    <li class="list-group-item"><strong>Phone Number:</strong> <span id="phoneDisplay"
+                                                                                     th:text="${user.getPhone()}"></span>
+                    </li>
+                </ul>
+            </div>
+            <form id="detailsForm" th:action="@{/profile/update}" method="post" style="display:none;">
+                <ul class="list-group list-group-flush">
+                    <li class="list-group-item">
+                        <label for="firstNameInput" class="form-label mb-0"><strong>First Name:</strong></label>
+                        <input type="text" id="firstNameInput" name="firstName" class="form-control"
+                               th:value="${user.firstName}">
+                    </li>
+                    <li class="list-group-item">
+                        <label for="lastNameInput" class="form-label mb-0"><strong>Last Name:</strong></label>
+                        <input type="text" id="lastNameInput" name="lastName" class="form-control"
+                               th:value="${user.lastName}">
+                    </li>
+                    <li class="list-group-item">
+                        <label for="emailInput" class="form-label mb-0"><strong>Email:</strong></label>
+                        <input type="email" id="emailInput" name="email" class="form-control" th:value="${user.email}">
+                    </li>
+                    <li class="list-group-item">
+                        <label for="phoneInput" class="form-label mb-0"><strong>Phone Number:</strong></label>
+                        <input type="text" id="phoneInput" name="phone" class="form-control"
+                               th:value="${user.getPhone()}">
+                    </li>
+                </ul>
+                <div class="d-flex justify-content-end mt-3 gap-2">
+                    <button type="button" id="cancelEditBtn" class="btn btn-secondary">Cancel</button>
+                    <button type="submit" class="btn btn-warning">Save Changes</button>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div id="addresses" class="card my-4 border-0 shadow">
+        <div class="card-header d-flex justify-content-between align-items-center">
+            <h2 class="h4 mb-0">My Addresses</h2>
+            <button type="button" class="btn btn-light btn-sm add-address-btn" data-bs-toggle="modal"
+                    data-bs-target="#addAddressModal">
+                <i class="bi bi-plus-circle me-1"></i> Add New Address
+            </button>
+        </div>
+        <div class="card-body">
+            <div th:if="${not #lists.isEmpty(addresses)}">
+                <ul class="list-group list-group-flush">
+                    <li class="list-group-item d-flex justify-content-between align-items-center"
+                        th:each="address : ${addresses}">
+                        <div>
+                            <p class="mb-0"
+                               th:text="${address.street + ', ' + address.city + ', ' + address.getPostalCode()}"></p>
+                        </div>
+                        <form th:action="@{/profile/address/delete}" method="post" style="display: inline;">
+                            <input type="hidden" name="addressId" th:value="${address.id}"/>
+                            <button type="submit" class="btn btn-outline-danger btn-sm"
+                                    onclick="return confirm('Are you sure you want to delete this address?')">
+                                Delete
+                            </button>
+                        </form>
+                    </li>
+                </ul>
+            </div>
+            <div th:unless="${not #lists.isEmpty(addresses)}">
+                <p class="text-muted text-center py-3">You have no saved addresses.</p>
+                <div class="text-center">
+                    <button type="button" class="btn btn-warning" data-bs-toggle="modal"
+                            data-bs-target="#addAddressModal">
+                        Add Your First Address
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div id="orders" class="card my-4 border-0 shadow">
+        <div class="card-header">
+            <h2 class="h4 mb-0">My Orders</h2>
+        </div>
+        <div class="card-body">
+            <div th:if="${not #lists.isEmpty(orders)}">
+                <ul class="list-group list-group-flush">
+                    <li class="list-group-item" th:each="order : ${orders}">
+                        <p class="mb-1"><strong>Order ID:</strong> <span th:text="${order.id}"></span></p>
+                        <p class="mb-0"><strong>Order Date:</strong> <span th:text="${order.getOrderDate()}"></span></p>
+                    </li>
+                </ul>
+            </div>
+            <div th:unless="${not #lists.isEmpty(orders)}">
+                <p class="text-muted text-center py-3">You have no past orders.</p>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Add Address Modal -->
+<div class="modal fade" id="addAddressModal" tabindex="-1" aria-labelledby="addAddressModalLabel" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="addAddressModalLabel">Add New Address</h5>
+                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+            </div>
+            <form th:action="@{/profile/address/add}" method="post">
+                <div class="modal-body">
+                    <div class="mb-3">
+                        <label for="street" class="form-label">Street Address</label>
+                        <input type="text" class="form-control" id="street" name="street" required
+                               placeholder="123 Main Street, Apt 4B">
+                    </div>
+                    <div class="mb-3">
+                        <label for="city" class="form-label">City</label>
+                        <input type="text" class="form-control" id="city" name="city" required
+                               placeholder="Skopje">
+                    </div>
+                    <div class="mb-3">
+                        <label for="postalCode" class="form-label">Postal Code</label>
+                        <input type="text" class="form-control" id="postalCode" name="postalCode" required
+                               placeholder="1000">
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
+                    <button type="submit" class="btn btn-warning">Add Address</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"
+        crossorigin="anonymous"></script>
+</body>
+</html>
Index: c/main/resources/templates/registe_customer.html
===================================================================
--- src/main/resources/templates/registe_customer.html	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ 	(revision )
@@ -1,88 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>EasyFood - Register</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css">
-</head>
-<body class="bg-light">
-
-<!-- Navbar -->
-<nav class="navbar bg-body-tertiary shadow-sm">
-    <div class="container-fluid">
-        <!-- Logo -->
-        <a class="navbar-brand d-flex align-items-center" href="index.html">
-            <img src="media/easyfood.png" alt="Logo" height="40">
-        </a>
-
-
-        <!-- Profile Icon -->
-        <div class="d-flex align-items-center">
-
-        </div>
-    </div>
-</nav>
-<div class=" mt-5 d-flex justify-content-center">
-</div>
-
-<!-- Profile Settings -->
-<div class="container my-5">
-    <div class="row justify-content-center">
-        <div class="col-md-8 col-lg-6">
-            <div class="card shadow-sm border-0 rounded-3">
-                <div class="card-body p-4">
-                    <!-- Title -->
-                    <h3 class="mb-4 text-center">Register as customer</h3>
-
-                    <!-- Profile Picture -->
-                    <div class="text-center mb-4">
-                        <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png"
-                             class="rounded-circle border shadow-sm"
-                             alt="Profile" width="100" height="100">
-
-                    </div>
-
-                    <div xmlns:th="http://www.thymeleaf.org">
-                        <!-- Form -->
-                        <form class="form-signin mt-xl-5" method="post" action="/register">
-                            <div class="mb-3">
-                                <label class="form-label fw-semibold">Full Name</label>
-                                <input type="text" name="fullName" class="form-control" value="">
-                            </div>
-
-                            <div class="mb-3">
-                                <label class="form-label fw-semibold">Email</label>
-                                <input type="email" name="email" class="form-control" value="">
-                            </div>
-
-                            <div class="mb-3">
-                                <label class="form-label fw-semibold">Phone Number</label>
-                                <input type="tel" name="phoneNumber" class="form-control" value="">
-                            </div>
-
-                            <div class="mb-3">
-                                <label class="form-label fw-semibold">Password</label>
-                                <input type="password" name="password" class="form-control" placeholder="">
-                            </div>
-
-                            <div class="mb-3">
-                                <label class="form-label fw-semibold">Repeat Password</label>
-                                <input type="password" name="repeatedPassword" class="form-control" placeholder="">
-                            </div>
-
-                            <div class="d-flex justify-content-center">
-                                <button type="submit" class="btn btn-warning fw-semibold">Register</button>
-                            </div>
-                        </form>
-
-                    </div>
-
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-</body>
-</html>
Index: src/main/resources/templates/register_customer.html
===================================================================
--- src/main/resources/templates/register_customer.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/resources/templates/register_customer.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>EasyFood - Register</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css">
+</head>
+<body class="bg-light">
+
+<!-- Navbar -->
+<nav class="navbar bg-body-tertiary shadow-sm">
+    <div class="container-fluid">
+        <!-- Logo -->
+        <a class="navbar-brand d-flex align-items-center" href="index.html">
+            <img src="media/easyfood.png" alt="Logo" height="40">
+        </a>
+
+
+        <!-- Profile Icon -->
+        <div class="d-flex align-items-center">
+
+        </div>
+    </div>
+</nav>
+<div class=" mt-5 d-flex justify-content-center">
+</div>
+
+<!-- Profile Settings -->
+<div class="container my-5">
+    <div class="row justify-content-center">
+        <div class="col-md-8 col-lg-6">
+            <div class="card shadow-sm border-0 rounded-3">
+                <div class="card-body p-4">
+                    <!-- Title -->
+                    <h3 class="mb-4 text-center">Register as customer</h3>
+
+                    <!-- Profile Picture -->
+                    <div class="text-center mb-4">
+                        <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png"
+                             class="rounded-circle border shadow-sm"
+                             alt="Profile" width="100" height="100">
+
+                    </div>
+
+                    <div xmlns:th="http://www.thymeleaf.org">
+                        <!-- Form -->
+                        <form class="form-signin mt-xl-5" method="post" action="/register">
+                            <div class="mb-3">
+                                <label class="form-label fw-semibold">Full Name</label>
+                                <input type="text" name="fullName" class="form-control" value="">
+                            </div>
+
+                            <div class="mb-3">
+                                <label class="form-label fw-semibold">Email</label>
+                                <input type="email" name="email" class="form-control" value="">
+                            </div>
+
+                            <div class="mb-3">
+                                <label class="form-label fw-semibold">Phone Number</label>
+                                <input type="tel" name="phoneNumber" class="form-control" value="">
+                            </div>
+
+                            <div class="mb-3">
+                                <label class="form-label fw-semibold">Password</label>
+                                <input type="password" name="password" class="form-control" placeholder="">
+                            </div>
+
+                            <div class="mb-3">
+                                <label class="form-label fw-semibold">Repeat Password</label>
+                                <input type="password" name="repeatedPassword" class="form-control" placeholder="">
+                            </div>
+
+                            <div class="d-flex justify-content-center">
+                                <button type="submit" class="btn btn-warning fw-semibold">Register</button>
+                            </div>
+                        </form>
+
+                    </div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+</body>
+</html>
Index: c/main/resources/templates/register_restaurant_owner.html
===================================================================
--- src/main/resources/templates/register_restaurant_owner.html	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ 	(revision )
@@ -1,88 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>EasyFood - Register</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css">
-</head>
-<body class="bg-light">
-
-<!-- Navbar -->
-<nav class="navbar bg-body-tertiary shadow-sm">
-    <div class="container-fluid">
-        <!-- Logo -->
-        <a class="navbar-brand d-flex align-items-center" href="index.html">
-            <img src="media/easyfood.png" alt="Logo" height="40">
-        </a>
-
-
-
-        <!-- Profile Icon -->
-        <div class="d-flex align-items-center">
-
-        </div>
-    </div>
-</nav>
-<div class=" mt-5 d-flex justify-content-center">
-    <div class="bg-white p-2 rounded-3 ">
-        <a href="">register as customer</a>/
-        <a class="text-warning">register as restaurant owner</a>
-    </div>
-</div>
-
-<!-- Profile Settings -->
-<div class="container my-5">
-    <div class="row justify-content-center">
-        <div class="col-md-8 col-lg-6">
-            <div class="card shadow-sm border-0 rounded-3">
-                <div class="card-body p-4">
-                    <!-- Title -->
-                    <h3 class="mb-4 text-center">Register as restaurant owner</h3>
-
-                    <!-- Profile Picture -->
-                    <div class="text-center mb-4">
-                        <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png"
-                             class="rounded-circle border shadow-sm"
-                             alt="Profile" width="100" height="100">
-
-                    </div>
-
-                    <!-- Form -->
-                    <form>
-                        <div class="mb-3">
-                            <label class="form-label fw-semibold">Full Name</label>
-                            <input type="text" class="form-control" value="John Doe">
-                        </div>
-
-                        <div class="mb-3">
-                            <label class="form-label fw-semibold">Email</label>
-                            <input type="email" class="form-control" value="john@example.com">
-                        </div>
-
-                        <div class="mb-3">
-                            <label class="form-label fw-semibold">Phone Number</label>
-                            <input type="tel" class="form-control" value="+1 234 567 890">
-                        </div>
-
-                        <div class="mb-3">
-                            <a> Click here to learn more</a>
-                        </div>
-                        <div class="mb-3">
-                            <label class="form-label fw-semibold">Needed documents</label>
-                            <input type="file" class="form-control" placeholder="********">
-                        </div>
-
-                        <div class="d-flex justify-content-center">
-                            <button type="submit" class="btn btn-warning fw-semibold">register</button>
-                        </div>
-                    </form>
-
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-</body>
-</html>
Index: src/main/resources/templates/restaurant_menu.html
===================================================================
--- src/main/resources/templates/restaurant_menu.html	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/resources/templates/restaurant_menu.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -2,10 +2,10 @@
 <html lang="en">
 <head>
-  <meta charset="UTF-8">
-  <title>Domino’s Pizza - Menu</title>
-  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
-        crossorigin="anonymous">
-  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"
-          crossorigin="anonymous"></script>
+    <meta charset="UTF-8">
+    <title>Domino’s Pizza - Menu</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
+          crossorigin="anonymous">
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"
+            crossorigin="anonymous"></script>
 </head>
 <body class="bg-light">
@@ -13,99 +13,99 @@
 <!-- Navbar -->
 <nav class="navbar bg-body-tertiary shadow-sm">
-  <div class="container-fluid">
-    <a class="navbar-brand d-flex align-items-center" href="home.html">
-      <img src="media/easyfood.png" alt="Logo" height="40" class="d-inline-block align-text-top">
-    </a>
+    <div class="container-fluid">
+        <a class="navbar-brand d-flex align-items-center" href="home.html">
+            <img src="media/easyfood.png" alt="Logo" height="40" class="d-inline-block align-text-top">
+        </a>
 
-    <span class="fw-semibold fs-5 mx-auto">Restaurant Menu</span>
+        <span class="fw-semibold fs-5 mx-auto">Restaurant Menu</span>
 
-    <div class="d-flex align-items-center gap-2">
-      <!-- Cart -->
-      <a href="cart.html" class="btn btn-outline-secondary rounded-circle p-2 position-relative">
-        <img src="https://cdn-icons-png.flaticon.com/512/1170/1170678.png" alt="Cart" width="22" height="22">
-        <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-warning text-dark">
+        <div class="d-flex align-items-center gap-2">
+            <!-- Cart -->
+            <a href="cart.html" class="btn btn-outline-secondary rounded-circle p-2 position-relative">
+                <img src="https://cdn-icons-png.flaticon.com/512/1170/1170678.png" alt="Cart" width="22" height="22">
+                <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-warning text-dark">
           2
         </span>
-      </a>
-      <!-- Profile -->
-      <a href="profile.html" class="btn btn-outline-secondary rounded-circle p-2">
-        <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png" alt="Profile" width="22" height="22">
-      </a>
+            </a>
+            <!-- Profile -->
+            <a href="profile.html" class="btn btn-outline-secondary rounded-circle p-2">
+                <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png" alt="Profile" width="22" height="22">
+            </a>
+        </div>
     </div>
-  </div>
 </nav>
 
 <!-- Restaurant Header -->
 <div class="container my-4">
-  <div class="card shadow-sm border-0">
-    <div class="card-body d-flex flex-column flex-md-row align-items-center">
-      <img src="media/dominos.png" alt="Domino’s Logo" class="rounded me-md-4 mb-3 mb-md-0" style="width:100px; height:100px; object-fit:contain;">
-      <div>
-        <h2 class="fw-bold mb-1">Domino’s Pizza</h2>
-        <p class="text-secondary small mb-0">Delicious pizzas, sides, and desserts delivered hot and fresh.</p>
-      </div>
+    <div class="card shadow-sm border-0">
+        <div class="card-body d-flex flex-column flex-md-row align-items-center">
+            <img src="media/dominos.png" alt="Domino’s Logo" class="rounded me-md-4 mb-3 mb-md-0" style="width:100px; height:100px; object-fit:contain;">
+            <div>
+                <h2 class="fw-bold mb-1">Domino’s Pizza</h2>
+                <p class="text-secondary small mb-0">Delicious pizzas, sides, and desserts delivered hot and fresh.</p>
+            </div>
+        </div>
     </div>
-  </div>
 </div>
 
 <div id="menu" class="container-fluid my-4">
-  <h4 class="mb-3">Menu</h4>
+    <h4 class="mb-3">Menu</h4>
 
-  <div class="card shadow-sm border-0 w-100 mb-3">
-    <div class="row g-0">
-      <!-- Image -->
-      <div class="col-md-3 col-4">
-        <img src="media/burger.png"
-             class="w-100 object-fit-cover rounded-start"
-             alt="Burger"
-             style="height:150px;">
-      </div>
+    <div class="card shadow-sm border-0 w-100 mb-3">
+        <div class="row g-0">
+            <!-- Image -->
+            <div class="col-md-3 col-4">
+                <img src="media/burger.png"
+                     class="w-100 object-fit-cover rounded-start"
+                     alt="Burger"
+                     style="height:150px;">
+            </div>
 
-      <!-- Content -->
-      <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
-        <div>
-          <h5 class="card-title mb-1">Cheese Burger</h5>
-          <p class="card-text text-muted fs-6 fw-semibold mb-2">25.85$</p>
+            <!-- Content -->
+            <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
+                <div>
+                    <h5 class="card-title mb-1">Cheese Burger</h5>
+                    <p class="card-text text-muted fs-6 fw-semibold mb-2">25.85$</p>
+                </div>
+                <button class="btn btn-warning fw-semibold align-self-start">Add to cart</button>
+            </div>
         </div>
-        <button class="btn btn-warning fw-semibold align-self-start">Add to cart</button>
-      </div>
     </div>
-  </div>
 
-  <div class="card shadow-sm border-0 w-100 mb-3">
-    <div class="row g-0">
-      <div class="col-md-3 col-4">
-        <img src="media/pizza.png"
-             class="w-100 object-fit-cover rounded-start"
-             alt="Pizza"
-             style="height:150px;">
-      </div>
-      <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
-        <div>
-          <h5 class="card-title mb-1">Pepperoni Pizza</h5>
-          <p class="card-text text-muted fs-6 fw-semibold mb-2">15.49$</p>
+    <div class="card shadow-sm border-0 w-100 mb-3">
+        <div class="row g-0">
+            <div class="col-md-3 col-4">
+                <img src="media/pizza.png"
+                     class="w-100 object-fit-cover rounded-start"
+                     alt="Pizza"
+                     style="height:150px;">
+            </div>
+            <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
+                <div>
+                    <h5 class="card-title mb-1">Pepperoni Pizza</h5>
+                    <p class="card-text text-muted fs-6 fw-semibold mb-2">15.49$</p>
+                </div>
+                <button class="btn btn-warning fw-semibold align-self-start">Add to cart</button>
+            </div>
         </div>
-        <button class="btn btn-warning fw-semibold align-self-start">Add to cart</button>
-      </div>
     </div>
-  </div>
 
-  <div class="card shadow-sm border-0 w-100 mb-3">
-    <div class="row g-0">
-      <div class="col-md-3 col-4">
-        <img src="media/buger.png"
-             class="w-100 object-fit-cover rounded-start"
-             alt="Sushi"
-             style="height:150px;">
-      </div>
-      <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
-        <div>
-          <h5 class="card-title mb-1">Sushi Set</h5>
-          <p class="card-text text-muted fs-6 fw-semibold mb-2">18.00$</p>
+    <div class="card shadow-sm border-0 w-100 mb-3">
+        <div class="row g-0">
+            <div class="col-md-3 col-4">
+                <img src="media/buger.png"
+                     class="w-100 object-fit-cover rounded-start"
+                     alt="Sushi"
+                     style="height:150px;">
+            </div>
+            <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
+                <div>
+                    <h5 class="card-title mb-1">Sushi Set</h5>
+                    <p class="card-text text-muted fs-6 fw-semibold mb-2">18.00$</p>
+                </div>
+                <button class="btn btn-warning fw-semibold align-self-start">Add to cart</button>
+            </div>
         </div>
-        <button class="btn btn-warning fw-semibold align-self-start">Add to cart</button>
-      </div>
     </div>
-  </div>
 </div>
 
Index: src/main/resources/templates/restaurant_owner_dashboard.html
===================================================================
--- src/main/resources/templates/restaurant_owner_dashboard.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/resources/templates/restaurant_owner_dashboard.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+</body>
+</html>
Index: src/main/resources/templates/restaurant_owner_login.html
===================================================================
--- src/main/resources/templates/restaurant_owner_login.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
+++ src/main/resources/templates/restaurant_owner_login.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>EasyFood - Login</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css">
+</head>
+<body class="bg-light">
+
+<!-- Navbar -->
+<nav class="navbar bg-body-tertiary shadow-sm">
+    <div class="container-fluid">
+        <!-- Logo -->
+        <a class="navbar-brand d-flex align-items-center" href="index.html">
+            <img src="/images/logo.JPG" alt="Logo" height="80">
+        </a>
+    </div>
+</nav>
+
+<!-- Login Form -->
+<div class="container my-5">
+    <div class="row justify-content-center">
+        <div class="col-md-6 col-lg-4">
+            <div class="card shadow-sm border-0 rounded-3">
+                <div class="card-body p-4">
+                    <h3 class="mb-4 text-center">Login</h3>
+
+                    <form>
+                        <!-- Email -->
+                        <div class="mb-3">
+                            <label class="form-label fw-semibold">Email</label>
+                            <input type="email" class="form-control" placeholder="Enter your email" required>
+                        </div>
+
+                        <!-- Password -->
+                        <div class="mb-3">
+                            <label class="form-label fw-semibold">Password</label>
+                            <input type="password" class="form-control" placeholder="Enter your password" required>
+                        </div>
+
+                        <!-- Submit Button -->
+                        <div class="d-flex justify-content-center">
+                            <button type="submit" class="btn btn-warning fw-semibold">Login</button>
+                        </div>
+
+                        <!-- Optional: link to registration -->
+                        <div class="text-center mt-3">
+                            <small>Don't have an account? <a href="register.html">Register here</a></small>
+                        </div>
+                    </form>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+</body>
+</html>
Index: src/main/resources/templates/shopping_cart.html
===================================================================
--- src/main/resources/templates/shopping_cart.html	(revision 65b8a76a1847fb99a743da3e73db48f8ba5c9b9c)
+++ src/main/resources/templates/shopping_cart.html	(revision 15c0ff74c54630af66e583925df149e17032aba5)
@@ -1,4 +1,4 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="UTF-8">
@@ -11,9 +11,8 @@
 <body class="bg-light">
 
-<!-- Navbar -->
 <nav class="navbar bg-body-tertiary shadow-sm">
     <div class="container-fluid">
-        <a class="navbar-brand d-flex align-items-center" href="home.html">
-            <img src="media/easyfood.png" alt="Logo" height="40" class="d-inline-block align-text-top">
+        <a class="navbar-brand d-flex align-items-center" href="/home">
+            <img src="/images/logo.JPG" alt="Logo" height="90" class="d-inline-block align-text-top">
         </a>
 
@@ -21,6 +20,5 @@
 
         <div class="d-flex align-items-center gap-2">
-            <!-- Profile -->
-            <a href="profile.html" class="btn btn-outline-secondary rounded-circle p-2">
+            <a href="/profile" class="btn btn-outline-secondary rounded-circle p-2">
                 <img src="https://cdn-icons-png.flaticon.com/512/847/847969.png"
                      alt="Profile" width="22" height="22">
@@ -30,57 +28,53 @@
 </nav>
 
-<!-- Cart Content -->
 <div class="container my-4">
     <h4 class="mb-3">Your Items</h4>
 
-    <!-- Item 1 -->
-    <div class="card shadow-sm border-0 w-100 mb-3">
-        <div class="row g-0">
-            <div class="col-md-3 col-4">
-                <img src="media/burger.png"
-                     class="w-100 object-fit-cover rounded-start"
-                     alt="Burger"
-                     style="height:150px;">
+    <div th:if="${cartItems != null and not #lists.isEmpty(cartItems)}">
+        <div th:each="cartItem : ${cartItems}" class="card shadow-sm border-0 w-100 mb-3">
+            <div class="row g-0">
+                <div class="col-md-3 col-4">
+                    <img th:src="@{'/media/' + ${cartItem.item.imageUrl}}"
+                         class="w-100 object-fit-cover rounded-start"
+                         th:alt="${cartItem.item.name}"
+                         style="height:150px;">
+                </div>
+                <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
+                    <div>
+                        <h5 class="card-title mb-1" th:text="${cartItem.item.name}">Item Name</h5>
+                        <p class="card-text text-muted fs-6 fw-semibold mb-2"
+                           th:text="${#numbers.formatDecimal(cartItem.item.price, 0, 'POINT', 2, 'COMMA')} + '$'">
+                            Price</p>
+                    </div>
+                    <div class="d-flex align-items-center gap-2">
+                        <form th:action="@{/cart/update}" method="post" class="d-flex align-items-center gap-2">
+                            <input type="hidden" name="itemId" th:value="${cartItem.item.id}"/>
+                            <input type="number" name="quantity" class="form-control w-25"
+                                   th:value="${cartItem.quantity}" min="1">
+                            <button type="submit" class="btn btn-primary btn-sm">Update</button>
+                        </form>
+                        <form th:action="@{/cart/remove}" method="post">
+                            <input type="hidden" name="itemId" th:value="${cartItem.item.id}"/>
+                            <button class="btn btn-danger btn-sm">Remove</button>
+                        </form>
+                    </div>
+                </div>
             </div>
-            <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
-                <div>
-                    <h5 class="card-title mb-1">Cheese Burger</h5>
-                    <p class="card-text text-muted fs-6 fw-semibold mb-2">12.99$</p>
-                </div>
-                <div class="d-flex align-items-center gap-2">
-                    <input type="number" class="form-control w-25" value="1" min="1">
-                    <button class="btn btn-danger btn-sm">Remove</button>
-                </div>
+        </div>
+
+        <div class="card shadow-sm border-0 p-3 mt-4">
+            <div class="d-flex justify-content-between align-items-center">
+                <h5>Total: <span class="text-warning"
+                                 th:text="${#numbers.formatDecimal(total, 0, 'POINT', 2, 'COMMA')} + '$'">43.97$</span>
+                </h5>
+                <a href="checkout.html" class="btn btn-warning fw-semibold">Proceed to Checkout</a>
             </div>
         </div>
     </div>
 
-    <!-- Item 2 -->
-    <div class="card shadow-sm border-0 w-100 mb-3">
-        <div class="row g-0">
-            <div class="col-md-3 col-4">
-                <img src="media/pizza.png"
-                     class="w-100 object-fit-cover rounded-start"
-                     alt="Pizza"
-                     style="height:150px;">
-            </div>
-            <div class="col-md-9 col-8 d-flex flex-column justify-content-between p-3" style="height:150px;">
-                <div>
-                    <h5 class="card-title mb-1">Pepperoni Pizza</h5>
-                    <p class="card-text text-muted fs-6 fw-semibold mb-2">15.49$</p>
-                </div>
-                <div class="d-flex align-items-center gap-2">
-                    <input type="number" class="form-control w-25" value="2" min="1">
-                    <button class="btn btn-danger btn-sm">Remove</button>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <!-- Checkout -->
-    <div class="card shadow-sm border-0 p-3 mt-4">
-        <div class="d-flex justify-content-between align-items-center">
-            <h5>Total: <span class="text-warning">43.97$</span></h5>
-            <a href="checkout.html" class="btn btn-warning fw-semibold">Proceed to Checkout</a>
+    <div th:unless="${cartItems != null and not #lists.isEmpty(cartItems)}" class="text-center">
+        <div class="alert alert-info mt-5" role="alert">
+            <p class="mb-0">Your cart is empty.</p>
+            <p>Go back to <a href="/home" class="alert-link">the home page</a> to add some items!</p>
         </div>
     </div>
