Index: src/main/java/mk/ukim/finki/synergymed/config/SecurityConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/config/SecurityConfig.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/config/SecurityConfig.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -40,5 +40,5 @@
                         // Static resources in /static, /public, /resources, /META-INF/resources
                         .requestMatchers(String.valueOf(PathRequest.toStaticResources().atCommonLocations())).permitAll()
-                        .requestMatchers("/", "/login", "/login.html", "/index.html", "/favicon.ico").permitAll()
+                        .requestMatchers("/", "/**", "/login", "/login.html", "/index.html", "/favicon.ico").permitAll()
 
                         // Public API/docs
Index: c/main/java/mk/ukim/finki/synergymed/exceptions/EmailAlreadyExistsException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/EmailAlreadyExistsException.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.synergymed.exceptions;
-
-public class EmailAlreadyExistsException extends RuntimeException{
-}
Index: src/main/java/mk/ukim/finki/synergymed/exceptions/HealthProfileDoesNotExistException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/HealthProfileDoesNotExistException.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/exceptions/HealthProfileDoesNotExistException.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,9 @@
+package mk.ukim.finki.synergymed.exceptions;
+
+public class HealthProfileDoesNotExistException extends RuntimeException{
+
+    @Override
+    public String getMessage() {
+        return "Client does not have a health profile.";
+    }
+}
Index: c/main/java/mk/ukim/finki/synergymed/exceptions/InvalidArgumentsException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/InvalidArgumentsException.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.synergymed.exceptions;
-
-public class InvalidArgumentsException extends RuntimeException{
-}
Index: c/main/java/mk/ukim/finki/synergymed/exceptions/InvalidEmailFormatException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/InvalidEmailFormatException.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.synergymed.exceptions;
-
-public class InvalidEmailFormatException extends RuntimeException{
-}
Index: src/main/java/mk/ukim/finki/synergymed/exceptions/MedicineDoesNotExistException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/MedicineDoesNotExistException.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/exceptions/MedicineDoesNotExistException.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,4 @@
+package mk.ukim.finki.synergymed.exceptions;
+
+public class MedicineDoesNotExistException extends RuntimeException{
+}
Index: c/main/java/mk/ukim/finki/synergymed/exceptions/PasswordsMismatchException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/PasswordsMismatchException.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.synergymed.exceptions;
-
-public class PasswordsMismatchException extends RuntimeException{
-}
Index: src/main/java/mk/ukim/finki/synergymed/exceptions/UserNotFoundException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/UserNotFoundException.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/exceptions/UserNotFoundException.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,4 @@
+package mk.ukim.finki.synergymed.exceptions;
+
+public class UserNotFoundException extends RuntimeException{
+}
Index: c/main/java/mk/ukim/finki/synergymed/exceptions/UsernameAlreadyExistsException.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/exceptions/UsernameAlreadyExistsException.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.synergymed.exceptions;
-
-public class UsernameAlreadyExistsException extends RuntimeException{
-}
Index: src/main/java/mk/ukim/finki/synergymed/models/AllergicreactionHealthprofileMedicine.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/AllergicreactionHealthprofileMedicine.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/models/AllergicreactionHealthprofileMedicine.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -2,4 +2,5 @@
 
 import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Setter;
Index: src/main/java/mk/ukim/finki/synergymed/models/AllergicreactionHealthprofileMedicineId.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/AllergicreactionHealthprofileMedicineId.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/models/AllergicreactionHealthprofileMedicineId.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -21,4 +21,11 @@
     private Integer medicineId;
 
+    public AllergicreactionHealthprofileMedicineId() {}
+
+    public AllergicreactionHealthprofileMedicineId(Integer healthProfileId, Integer medicineId) {
+        this.healthProfileId = healthProfileId;
+        this.medicineId = medicineId;
+    }
+
     @Override
     public boolean equals(Object o) {
Index: src/main/java/mk/ukim/finki/synergymed/repositories/ClientRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/repositories/ClientRepository.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/repositories/ClientRepository.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -3,5 +3,16 @@
 import mk.ukim.finki.synergymed.models.Client;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 public interface ClientRepository extends JpaRepository<Client, Integer> {
+    @Query("SELECT c FROM Client c WHERE c.id NOT IN (SELECT h.client.id FROM Healthprofile h)")
+    List<Client> findClientsWithoutHealthProfile();
+
+    @Query("SELECT c FROM Client c WHERE c.id NOT IN (SELECT h.client.id FROM Healthprofile h) " +
+            "AND (LOWER(c.users.firstName) LIKE :searchTerm OR LOWER(c.users.lastName) LIKE :searchTerm)")
+    List<Client> findClientsWithoutHealthProfileByName(@Param("searchTerm") String searchTerm);
+
 }
Index: src/main/java/mk/ukim/finki/synergymed/repositories/ClubcardRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/repositories/ClubcardRepository.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/repositories/ClubcardRepository.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -4,4 +4,7 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.Optional;
+
 public interface ClubcardRepository extends JpaRepository<Clubcard, Integer> {
+    Optional<Clubcard> findByUser_Id(Integer user_id);
 }
Index: src/main/java/mk/ukim/finki/synergymed/repositories/HealthprofileRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/repositories/HealthprofileRepository.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/repositories/HealthprofileRepository.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -4,4 +4,7 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.Optional;
+
 public interface HealthprofileRepository extends JpaRepository<Healthprofile, Integer> {
+    Optional<Healthprofile> findByClientId(Integer client_id);
 }
Index: src/main/java/mk/ukim/finki/synergymed/repositories/MedicineRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/repositories/MedicineRepository.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/repositories/MedicineRepository.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -4,4 +4,7 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.Optional;
+
 public interface MedicineRepository extends JpaRepository<Medicine, Integer> {
+    Optional<Medicine> getMedicineById(Integer id);
 }
Index: src/main/java/mk/ukim/finki/synergymed/repositories/UserRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/repositories/UserRepository.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/repositories/UserRepository.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -1,8 +1,11 @@
 package mk.ukim.finki.synergymed.repositories;
 
+import mk.ukim.finki.synergymed.models.Client;
 import mk.ukim.finki.synergymed.models.User;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 
+import java.util.List;
 import java.util.Optional;
 
@@ -11,3 +14,4 @@
     Optional<User> findByEmail(String email);
     boolean existsByUsername(String username);
+
 }
Index: src/main/java/mk/ukim/finki/synergymed/service/ClientService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/ClientService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/ClientService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Client;
+import java.util.List;
+
+public interface ClientService {
+
+    List<Client> findAllClientsWithoutHealthProfile();
+
+    List<Client> findClientsWithoutHealthProfileByName(String searchTerm);
+    Client findClientById(Integer clientId);
+    List<Client> findAll();
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/ClubCardService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/ClubCardService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/ClubCardService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.synergymed.service;
+
+
+import mk.ukim.finki.synergymed.models.Client;
+import mk.ukim.finki.synergymed.models.Clubcard;
+
+import java.util.Optional;
+
+public interface ClubCardService {
+    Clubcard createForClient(Client client);
+    Optional<Clubcard> getByClientId(Integer clientId);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/HealthProfileService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/HealthProfileService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/HealthProfileService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,21 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Client;
+import mk.ukim.finki.synergymed.models.Healthprofile;
+import mk.ukim.finki.synergymed.models.User;
+
+import java.time.LocalDate;
+import java.util.Optional;
+
+public interface HealthProfileService {
+    Healthprofile createForClient(Client client, String bloodType);
+
+    public void addAllergy(Integer clientId,
+                           Integer medicineId,
+                           LocalDate dateDiagnosed,
+                           String description,
+                           String severity);
+
+
+    Optional<Healthprofile> getByClientId(Integer clientId);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/UserService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/UserService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/UserService.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.User;
+
+public interface UserService {
+    User findUserById(Integer id);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/ClientServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/ClientServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/ClientServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,39 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.models.Client;
+import mk.ukim.finki.synergymed.repositories.ClientRepository;
+import mk.ukim.finki.synergymed.service.ClientService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class ClientServiceImpl implements ClientService {
+
+    private final ClientRepository clientRepository;
+
+    @Override
+    public List<Client> findAllClientsWithoutHealthProfile() {
+        return clientRepository.findClientsWithoutHealthProfile();
+    }
+
+    @Override
+    public List<Client> findClientsWithoutHealthProfileByName(String searchTerm) {
+        // ensure case-insensitive search by wrapping with %...%
+        String term = "%" + searchTerm.toLowerCase() + "%";
+        return clientRepository.findClientsWithoutHealthProfileByName(term);
+    }
+
+    @Override
+    public Client findClientById(Integer clientId) {
+        return clientRepository.findById(clientId)
+                .orElseThrow(() -> new RuntimeException("Client not found with id " + clientId));
+    }
+
+    @Override
+    public List<Client> findAll() {
+        return clientRepository.findAll();
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/ClubCardServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/ClubCardServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/ClubCardServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,29 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.models.Client;
+import mk.ukim.finki.synergymed.models.Clubcard;
+import mk.ukim.finki.synergymed.repositories.ClubcardRepository;
+import mk.ukim.finki.synergymed.service.ClubCardService;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+@RequiredArgsConstructor
+public class ClubCardServiceImpl implements ClubCardService {
+    private final ClubcardRepository clubcardRepository;
+
+    public Clubcard createForClient(Client client) {
+        Clubcard card = new Clubcard();
+        card.setUser(client);
+        card.setClubProgram("Default Loyalty Program");
+        card.setPoints(0);
+        return clubcardRepository.save(card);
+    }
+    @Override
+    public Optional<Clubcard> getByClientId(Integer clientId) {
+        return clubcardRepository.findByUser_Id(clientId);
+    }
+}
+
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/HealthProfileServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/HealthProfileServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/HealthProfileServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,72 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.exceptions.HealthProfileDoesNotExistException;
+import mk.ukim.finki.synergymed.exceptions.MedicineDoesNotExistException;
+import mk.ukim.finki.synergymed.models.*;
+import mk.ukim.finki.synergymed.repositories.AllergicreactionHealthprofileMedicineRepository;
+import mk.ukim.finki.synergymed.repositories.HealthprofileRepository;
+import mk.ukim.finki.synergymed.repositories.MedicineRepository;
+import mk.ukim.finki.synergymed.service.HealthProfileService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.Optional;
+
+@Service
+@RequiredArgsConstructor
+public class HealthProfileServiceImpl implements HealthProfileService {
+
+    private final HealthprofileRepository healthprofileRepository;
+    private final AllergicreactionHealthprofileMedicineRepository allergicreactionHealthprofileMedicineRepo;
+    private final MedicineRepository medicineRepository;
+
+    @Override
+    public Healthprofile createForClient(Client client, String bloodType) {
+        // TODO: 28.8.2025 Check if the client already has a health profile
+
+        Healthprofile profile = new Healthprofile();
+        profile.setClient(client);
+        profile.setBloodType(bloodType);
+
+        return healthprofileRepository.save(profile);
+    }
+
+    @Override
+    public void addAllergy(Integer clientId,
+                           Integer medicineId,
+                           LocalDate dateDiagnosed,
+                           String description,
+                           String severity) {
+
+        Healthprofile healthprofile = healthprofileRepository
+                .findByClientId(clientId)
+                .orElseThrow(HealthProfileDoesNotExistException::new);
+
+        Medicine medicine = medicineRepository
+                .getMedicineById(medicineId)
+                .orElseThrow(MedicineDoesNotExistException::new);
+
+        AllergicreactionHealthprofileMedicine allergy = new AllergicreactionHealthprofileMedicine();
+
+        AllergicreactionHealthprofileMedicineId key = new AllergicreactionHealthprofileMedicineId(
+                healthprofile.getId(),
+                medicineId
+        );
+
+        allergy.setId(key);
+        allergy.setHealthProfile(healthprofile);
+        allergy.setMedicine(medicine);
+        allergy.setDateDiagnosed(dateDiagnosed);
+        allergy.setDescription(description);
+        allergy.setSeverity(severity);
+
+        allergicreactionHealthprofileMedicineRepo.save(allergy);
+    }
+
+
+    @Override
+    public Optional<Healthprofile> getByClientId(Integer clientId) {
+        return healthprofileRepository.findByClientId(clientId);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/UserServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/UserServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/UserServiceImpl.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,20 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.exceptions.UserNotFoundException;
+import mk.ukim.finki.synergymed.models.User;
+import mk.ukim.finki.synergymed.repositories.UserRepository;
+import mk.ukim.finki.synergymed.service.UserService;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class UserServiceImpl implements UserService {
+    private final UserRepository userRepository;
+    @Override
+    public User findUserById(Integer id) {
+        return userRepository
+                .findById(id)
+                .orElseThrow(UserNotFoundException::new);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/web/AllergyController.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/web/AllergyController.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/web/AllergyController.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,87 @@
+package mk.ukim.finki.synergymed.web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.models.Healthprofile;
+import mk.ukim.finki.synergymed.models.Medicine;
+import mk.ukim.finki.synergymed.models.User;
+import mk.ukim.finki.synergymed.repositories.MedicineRepository;
+import mk.ukim.finki.synergymed.service.HealthProfileService;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import jakarta.servlet.http.HttpSession;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
+
+@Controller
+@RequestMapping("/allergies")
+@RequiredArgsConstructor
+public class AllergyController {
+
+    private final HealthProfileService healthProfileService;
+    private final MedicineRepository medicineRepository;
+
+    @GetMapping("/manage")
+    public String manageAllergies(HttpSession session, Model model) {
+        User user = (User) session.getAttribute("user");
+        String username = (String) session.getAttribute("username");
+
+        if (user == null || username == null) {
+            System.out.println("NO USER IN SESSION");
+            return "redirect:/login";
+        }
+
+        // Check if user has a health profile
+        Optional<Healthprofile> healthProfile = healthProfileService.getByClientId(user.getId());
+        if (healthProfile.isEmpty()) {
+            model.addAttribute("error", "No health profile found. Please contact your healthcare provider.");
+            return "redirect:/profile";
+        }
+
+        // Get all available medicines for the dropdown
+        List<Medicine> medicines = medicineRepository.findAll();
+
+        model.addAttribute("user", user);
+        model.addAttribute("username", username);
+        model.addAttribute("healthProfile", healthProfile.get());
+        model.addAttribute("medicines", medicines);
+
+        return "manage-allergies";
+    }
+
+    @PostMapping("/add")
+    public String addAllergy(@RequestParam Integer medicineId,
+                             @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate dateDiagnosed,
+                             @RequestParam String description,
+                             @RequestParam String severity,
+                             HttpSession session,
+                             RedirectAttributes redirectAttributes) {
+
+        User user = (User) session.getAttribute("user");
+
+        if (user == null) {
+            return "redirect:/login";
+        }
+
+        try {
+            healthProfileService.addAllergy(
+                    user.getId(),
+                    medicineId,
+                    dateDiagnosed,
+                    description,
+                    severity
+            );
+
+            redirectAttributes.addFlashAttribute("success", "Allergy added successfully!");
+
+        } catch (Exception e) {
+            redirectAttributes.addFlashAttribute("error", "Failed to add allergy: " + e.getMessage());
+        }
+
+        return "redirect:/profile";
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/web/HealthProfileController.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/web/HealthProfileController.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/web/HealthProfileController.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,95 @@
+package mk.ukim.finki.synergymed.web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.models.Client;
+import mk.ukim.finki.synergymed.models.User;
+import mk.ukim.finki.synergymed.service.ClientService;
+import mk.ukim.finki.synergymed.service.HealthProfileService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import jakarta.servlet.http.HttpSession;
+import java.util.List;
+
+@Controller
+@RequestMapping("/admin/health-profile")
+@RequiredArgsConstructor
+public class HealthProfileController {
+
+    private final HealthProfileService healthProfileService;
+    private final ClientService clientService;
+
+    // TODO: 28.8.2025 Only admins can access this
+    @GetMapping("/create")
+    public String getCreateHealthProfilePage(
+            @RequestParam(required = false) String searchTerm,
+            HttpSession session,
+            Model model) {
+
+        User user = (User) session.getAttribute("user");
+
+        if (user == null) {
+            return "redirect:/login";
+        }
+
+        model.addAttribute("user", user);
+
+        // Get clients without health profiles
+        List<Client> clientsWithoutHealthProfile;
+
+        if (searchTerm != null && !searchTerm.trim().isEmpty()) {
+            clientsWithoutHealthProfile = clientService.findClientsWithoutHealthProfileByName(searchTerm);
+            model.addAttribute("searchTerm", searchTerm);
+            model.addAttribute("searched", true);
+        } else {
+            clientsWithoutHealthProfile = clientService.findAllClientsWithoutHealthProfile();
+            model.addAttribute("searched", false);
+        }
+
+        model.addAttribute("clients", clientsWithoutHealthProfile);
+
+        return "create-health-profile";
+    }
+
+    @PostMapping("/create")
+    public String createHealthProfile(
+            @RequestParam Integer clientId,
+            @RequestParam String bloodType,
+            HttpSession session,
+            RedirectAttributes redirectAttributes) {
+
+        User user = (User) session.getAttribute("user");
+
+        if (user == null) {
+            return "redirect:/login";
+        }
+
+        // TODO: Add admin role check here
+
+        try {
+            Client client = clientService.findClientById(clientId);
+            healthProfileService.createForClient(client, bloodType);
+
+            redirectAttributes.addFlashAttribute("success",
+                    "Health profile created successfully.");
+
+            return "redirect:/admin/health-profile/create";
+
+        }
+        catch (Exception e) {
+            redirectAttributes.addFlashAttribute("error", "Failed to create health profile: " + e.getMessage());
+            return "redirect:/admin/health-profile/create";
+        }
+    }
+
+    @GetMapping("/search")
+    @ResponseBody
+    public List<Client> searchClients(@RequestParam String term) {
+        if (term == null || term.trim().isEmpty()) {
+            return clientService.findAllClientsWithoutHealthProfile();
+        }
+        return clientService.findClientsWithoutHealthProfileByName(term);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/web/LoginController.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/web/LoginController.java	(revision 58f18014eb031b2da8cc131f37bb9591e1637b43)
+++ src/main/java/mk/ukim/finki/synergymed/web/LoginController.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -2,4 +2,6 @@
 
 import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.models.User;
+import mk.ukim.finki.synergymed.repositories.UserRepository;
 import mk.ukim.finki.synergymed.service.jwt.JwtService;
 import org.springframework.security.authentication.AuthenticationManager;
@@ -20,4 +22,5 @@
     private final AuthenticationManager authenticationManager;
     private final JwtService jwtService;
+    private final UserRepository userRepository; // Add this
 
     @GetMapping
@@ -39,11 +42,15 @@
             String token = jwtService.generate(userDetails);
 
-            // store jwt in session
+            // Fetch your custom User entity from database
+            User user = userRepository.findByUsername(username)
+                    .orElseThrow(() -> new RuntimeException("User not found"));
+
+            // Store both UserDetails and your custom User entity
             session.setAttribute("jwt_token", token);
             session.setAttribute("username", username);
-            session.setAttribute("user", userDetails);
+            session.setAttribute("userDetails", userDetails); // Spring Security UserDetails
+            session.setAttribute("user", user); // Your custom User entity
 
-            // redirect to home after a successful login
-            return "redirect:/home";
+            return "redirect:/profile";
 
         } catch (BadCredentialsException e) {
Index: src/main/java/mk/ukim/finki/synergymed/web/ProfileController.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/web/ProfileController.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/java/mk/ukim/finki/synergymed/web/ProfileController.java	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,50 @@
+package mk.ukim.finki.synergymed.web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.synergymed.models.Healthprofile;
+import mk.ukim.finki.synergymed.models.User;
+import mk.ukim.finki.synergymed.service.HealthProfileService;
+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 jakarta.servlet.http.HttpSession;
+import java.util.Optional;
+
+@Controller
+@RequestMapping("/profile")
+@RequiredArgsConstructor
+public class ProfileController {
+
+    private final HealthProfileService healthProfileService;
+
+    @GetMapping
+    public String getProfilePage(HttpSession session, Model model) {
+        // Get your custom User entity directly from session
+        User user = (User) session.getAttribute("user");
+        String username = (String) session.getAttribute("username");
+
+        if (user == null || username == null) {
+            return "redirect:/login";
+        }
+
+        model.addAttribute("user", user);
+        model.addAttribute("username", username);
+
+        try {
+            Optional<Healthprofile> healthProfile = healthProfileService.getByClientId(user.getId());
+
+            if (healthProfile.isPresent()) {
+                model.addAttribute("healthProfile", healthProfile.get());
+                model.addAttribute("hasHealthProfile", true);
+            } else {
+                model.addAttribute("hasHealthProfile", false);
+            }
+        } catch (Exception e) {
+            model.addAttribute("hasHealthProfile", false);
+        }
+
+        return "profile";
+    }
+}
Index: src/main/resources/templates/create-health-profile.html
===================================================================
--- src/main/resources/templates/create-health-profile.html	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/resources/templates/create-health-profile.html	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,235 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>SynergyMed - Admin: Create Health Profile</title>
+    <style>
+        * { margin:0; padding:0; box-sizing:border-box; }
+        body {
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+            background: linear-gradient(135deg, #a4ecba 0%, #f7f7f8 100%);
+            min-height: 100vh;
+            padding: 20px;
+        }
+        .container { max-width: 1200px; margin:0 auto; }
+        .header {
+            background:white; border-radius:20px; box-shadow:0 10px 30px rgba(0,0,0,.1);
+            margin-bottom:30px; overflow:hidden;
+        }
+        .header-content {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color:white; padding:30px; text-align:center;
+        }
+        .header-content h1 { font-size:2.5rem; font-weight:300; margin-bottom:10px; }
+        .header-content p { font-size:1.1rem; opacity:.9; }
+        .admin-badge {
+            background: rgba(255,255,255,0.2);
+            padding:8px 16px; border-radius:20px;
+            font-size:.9rem; display:inline-block; margin-top:10px;
+        }
+        .nav-bar {
+            background:white; border-radius:15px;
+            box-shadow:0 5px 15px rgba(0,0,0,.1);
+            margin-bottom:30px; padding:20px 30px;
+        }
+        .nav-links { display:flex; gap:20px; align-items:center; }
+        .nav-link {
+            color:#20b2aa; text-decoration:none;
+            padding:10px 20px; border-radius:25px;
+            transition:all .3s ease; font-weight:500;
+        }
+        .nav-link:hover, .nav-link.active {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color:white;
+        }
+        .main-content { display:grid; gap:30px; }
+        .card {
+            background:white; border-radius:20px;
+            box-shadow:0 10px 30px rgba(0,0,0,.1);
+            overflow:hidden;
+        }
+        .card-header {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color:white; padding:25px 30px; font-size:1.3rem; font-weight:600;
+        }
+        .card-body { padding:30px; }
+        .search-form { display:flex; gap:15px; margin-bottom:20px; }
+        .search-input {
+            flex:1; padding:15px 20px; border:2px solid #e9ecef; border-radius:15px;
+            font-size:1rem; transition:all .3s ease;
+        }
+        .search-input:focus {
+            outline:none; border-color:#20b2aa;
+            box-shadow:0 0 0 3px rgba(32,178,170,.1);
+        }
+        .btn {
+            padding:15px 30px; border-radius:25px; font-weight:600; font-size:1rem;
+            text-decoration:none; border:none; cursor:pointer;
+            transition:all .3s ease; display:inline-block; text-align:center;
+        }
+        .btn-primary {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color:white;
+        }
+        .btn-primary:hover {
+            transform:translateY(-2px);
+            box-shadow:0 5px 15px rgba(32,178,170,.4);
+        }
+        .btn-secondary {
+            background:#6c757d; color:white;
+        }
+        .btn-secondary:hover {
+            background:#5a6268; transform:translateY(-2px);
+        }
+        .clients-grid {
+            display:grid; gap:15px; margin-bottom:30px;
+            max-height:400px; overflow-y:auto;
+        }
+        .client-item {
+            background:#f8f9fa; border:2px solid #e9ecef;
+            border-radius:15px; padding:20px;
+            transition:all .3s ease; cursor:pointer;
+            display:flex; justify-content:space-between; align-items:center;
+        }
+        .client-item:hover { border-color:#20b2aa; background:#f1fdfd; }
+        .client-item.selected {
+            border-color:#20b2aa;
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color:white;
+        }
+        .blood-type-section { margin-top:30px; padding-top:30px; border-top:1px solid #e9ecef; display:none; }
+        .blood-type-section.visible { display:block; animation:fadeIn .3s ease; }
+        @keyframes fadeIn { from{opacity:0; transform:translateY(20px);} to{opacity:1; transform:translateY(0);} }
+        .blood-type-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(80px,1fr)); gap:15px; margin-top:15px; }
+        .blood-type-radio { display:none; }
+        .blood-type-label {
+            display:block; background:#f8f9fa; border:2px solid #e9ecef;
+            border-radius:15px; padding:20px 15px; text-align:center;
+            font-weight:bold; color:#666; cursor:pointer;
+            transition:all .3s ease;
+        }
+        .blood-type-radio:checked + .blood-type-label {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color:white; border-color:#20b2aa; transform:scale(1.05);
+        }
+        .blood-type-label:hover { border-color:#20b2aa; background:#f1fdfd; }
+        .form-actions { display:flex; gap:15px; justify-content:center; margin-top:30px; }
+        .alert { padding:15px 20px; border-radius:15px; margin-bottom:20px; font-weight:500; }
+        .alert-success { background:#d1edff; color:#0c5460; border:1px solid #bee5eb; }
+        .alert-danger { background:#f8d7da; color:#721c24; border:1px solid #f5c6cb; }
+        .alert-info { background:#d1ecf1; color:#0c5460; border:1px solid #bee5eb; }
+        .selected-client-info {
+            background: linear-gradient(135deg, #e3f2fd, #f3e5f5);
+            border-radius:15px; padding:20px; margin-bottom:25px; border-left:4px solid #20b2aa;
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+    <!-- Header -->
+    <div class="header">
+        <div class="header-content">
+            <h1>Admin Panel</h1>
+            <p>Create Health Profiles for Clients</p>
+            <div class="admin-badge">Administrator Access</div>
+        </div>
+    </div>
+
+    <!-- Navigation -->
+    <div class="nav-bar">
+        <div class="nav-links">
+            <a href="/admin/dashboard" class="nav-link">Dashboard</a>
+            <a href="/admin/clients" class="nav-link">Manage Clients</a>
+            <a href="/admin/health-profile/create" class="nav-link active">Create Health Profile</a>
+            <a href="/profile" class="nav-link">Back to Profile</a>
+        </div>
+    </div>
+
+    <!-- Flash Messages -->
+    <div th:if="${success}" class="alert alert-success"><span th:text="${success}">Success</span></div>
+    <div th:if="${error}" class="alert alert-danger"><span th:text="${error}">Error</span></div>
+
+    <!-- Main -->
+    <div class="main-content">
+        <div class="card">
+            <div class="card-header">Create Health Profile for Client</div>
+            <div class="card-body">
+                <!-- Search -->
+                <form class="search-form" th:action="@{/admin/health-profile/create}" method="get">
+                    <input type="text" name="searchTerm" class="search-input"
+                           placeholder="Search clients by first or last name..."
+                           th:value="${searchTerm}">
+                    <button type="submit" class="btn btn-primary">Search</button>
+                </form>
+
+                <!-- Clients -->
+                <div th:if="${!#lists.isEmpty(clients)}" class="clients-grid" id="clientsGrid">
+                    <div th:each="client : ${clients}"
+                         class="client-item"
+                         th:data-client-id="${client.id}"
+                         th:data-client-name="${client.users.firstName + ' ' + client.users.lastName}"
+                         onclick="selectClient(this)">
+                        <div>
+                            <h4 th:text="${client.users.firstName + ' ' + client.users.lastName}">John Doe</h4>
+                            <p th:text="${client.users.email}">john@email.com</p>
+                        </div>
+                        <div>ID: <span th:text="${client.id}">1</span></div>
+                    </div>
+                </div>
+
+                <!-- Empty -->
+                <div th:if="${#lists.isEmpty(clients)}" class="alert alert-info">No clients found.</div>
+
+                <!-- Form -->
+                <form th:action="@{/admin/health-profile/create}" method="post" id="createProfileForm">
+                    <input type="hidden" name="clientId" id="selectedClientId">
+                    <div id="selectedClientInfo" class="selected-client-info" style="display:none;">
+                        <h4>Creating profile for:</h4>
+                        <p id="selectedClientName"></p>
+                    </div>
+                    <div class="blood-type-section" id="bloodTypeSection">
+                        <h3>Select Blood Type</h3>
+                        <div class="blood-type-grid">
+                            <div><input type="radio" id="a+" name="bloodType" value="A+" class="blood-type-radio"><label for="a+" class="blood-type-label">A+</label></div>
+                            <div><input type="radio" id="a-" name="bloodType" value="A-" class="blood-type-radio"><label for="a-" class="blood-type-label">A-</label></div>
+                            <div><input type="radio" id="b+" name="bloodType" value="B+" class="blood-type-radio"><label for="b+" class="blood-type-label">B+</label></div>
+                            <div><input type="radio" id="b-" name="bloodType" value="B-" class="blood-type-radio"><label for="b-" class="blood-type-label">B-</label></div>
+                            <div><input type="radio" id="ab+" name="bloodType" value="AB+" class="blood-type-radio"><label for="ab+" class="blood-type-label">AB+</label></div>
+                            <div><input type="radio" id="ab-" name="bloodType" value="AB-" class="blood-type-radio"><label for="ab-" class="blood-type-label">AB-</label></div>
+                            <div><input type="radio" id="o+" name="bloodType" value="O+" class="blood-type-radio"><label for="o+" class="blood-type-label">O+</label></div>
+                            <div><input type="radio" id="o-" name="bloodType" value="O-" class="blood-type-radio"><label for="o-" class="blood-type-label">O-</label></div>
+                        </div>
+                        <div class="form-actions">
+                            <button type="submit" class="btn btn-primary">Create</button>
+                            <button type="button" class="btn btn-secondary" onclick="clearSelection()">Clear</button>
+                        </div>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+    let selectedClientId=null;
+    function selectClient(el){
+        document.querySelectorAll('.client-item').forEach(i=>i.classList.remove('selected'));
+        el.classList.add('selected');
+        selectedClientId=el.getAttribute('data-client-id');
+        document.getElementById('selectedClientId').value=selectedClientId;
+        document.getElementById('selectedClientName').textContent=el.getAttribute('data-client-name');
+        document.getElementById('selectedClientInfo').style.display='block';
+        document.getElementById('bloodTypeSection').classList.add('visible');
+    }
+    function clearSelection(){
+        document.querySelectorAll('.client-item').forEach(i=>i.classList.remove('selected'));
+        document.querySelectorAll('.blood-type-radio').forEach(r=>r.checked=false);
+        document.getElementById('selectedClientInfo').style.display='none';
+        document.getElementById('bloodTypeSection').classList.remove('visible');
+        selectedClientId=null; document.getElementById('selectedClientId').value='';
+    }
+</script>
+</body>
+</html>
Index: src/main/resources/templates/manage-allergies.html
===================================================================
--- src/main/resources/templates/manage-allergies.html	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/resources/templates/manage-allergies.html	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>SynergyMed - Manage Allergies</title>
+  <style>
+    * { margin:0; padding:0; box-sizing:border-box; }
+    body {
+      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+      background: linear-gradient(135deg, #a4ecba 0%, #f7f7f8 100%);
+      min-height:100vh; padding:20px;
+    }
+    .container { max-width:800px; margin:0 auto; }
+    .header { background:white; border-radius:20px; box-shadow:0 10px 30px rgba(0,0,0,.1); margin-bottom:30px; overflow:hidden; }
+    .header-content { background:linear-gradient(135deg,#20b2aa,#48d1cc); color:white; padding:30px; text-align:center; }
+    .header-content h1 { font-size:2.5rem; font-weight:300; margin-bottom:10px; }
+    .header-content p { font-size:1.1rem; opacity:.9; }
+    .nav-bar { background:white; border-radius:15px; box-shadow:0 5px 15px rgba(0,0,0,.1); margin-bottom:30px; padding:20px 30px; }
+    .nav-links { display:flex; gap:20px; align-items:center; }
+    .nav-link { color:#20b2aa; text-decoration:none; padding:10px 20px; border-radius:25px; transition:all .3s ease; font-weight:500; }
+    .nav-link:hover, .nav-link.active { background:linear-gradient(135deg,#20b2aa,#48d1cc); color:white; }
+    .back-btn { margin-left:auto; background:linear-gradient(135deg,#6c757d,#495057); color:white; }
+    .card { background:white; border-radius:20px; box-shadow:0 10px 30px rgba(0,0,0,.1); overflow:hidden; margin-bottom:30px; }
+    .card-header { background:linear-gradient(135deg,#20b2aa,#48d1cc); color:white; padding:25px 30px; font-size:1.3rem; font-weight:600; }
+    .card-body { padding:30px; }
+    .form-group { margin-bottom:25px; }
+    .form-group label { display:block; margin-bottom:8px; color:#555; font-weight:500; font-size:.9rem; }
+    .form-control { width:100%; padding:15px 20px; border:2px solid #e1e5e9; border-radius:12px; font-size:1rem; transition:all .3s ease; background:#f8f9fa; }
+    .form-control:focus { outline:none; border-color:#20b2aa; background:white; box-shadow:0 0 0 3px rgba(32,178,170,.1); }
+    select.form-control { cursor:pointer; }
+    textarea.form-control { resize:vertical; min-height:100px; }
+    .severity-options { display:flex; gap:15px; margin-top:10px; }
+    .severity-option { flex:1; }
+    .severity-option input[type="radio"] { display:none; }
+    .severity-label { display:block; padding:12px 20px; border:2px solid #e1e5e9; border-radius:10px; text-align:center; cursor:pointer; transition:all .3s ease; font-weight:500; }
+    .severity-option input[type="radio"]:checked + .severity-label.low { background:#d1ecf1; border-color:#0c5460; color:#0c5460; }
+    .severity-option input[type="radio"]:checked + .severity-label.medium { background:#fff3cd; border-color:#856404; color:#856404; }
+    .severity-option input[type="radio"]:checked + .severity-label.high { background:#fee; border-color:#c33; color:#c33; }
+    .btn-submit { width:100%; padding:15px; background:linear-gradient(135deg,#20b2aa,#48d1cc); color:white; border:none; border-radius:12px; font-size:1rem; font-weight:600; cursor:pointer; transition:all .3s ease; text-transform:uppercase; letter-spacing:1px; }
+    .btn-submit:hover { transform:translateY(-2px); box-shadow:0 10px 20px rgba(32,178,170,.3); }
+    .btn-submit:active { transform:translateY(0); }
+    .alert { padding:15px; border-radius:8px; margin-bottom:20px; font-size:.9rem; }
+    .alert-danger { background-color:#fee; color:#c33; border:1px solid #fcc; }
+    .alert-success { background-color:#efe; color:#363; border:1px solid #cfc; }
+    .current-allergies { background:#f8f9fa; border-radius:15px; padding:20px; margin-bottom:20px; }
+    .current-allergies h3 { color:#333; margin-bottom:15px; font-size:1.1rem; }
+    .allergy-item { background:white; border-radius:10px; padding:15px; margin-bottom:10px; border-left:4px solid #20b2aa; display:flex; justify-content:space-between; align-items:center; }
+    .allergy-info { flex:1; }
+    .medicine-name { font-weight:600; color:#333; margin-bottom:5px; }
+    .allergy-description { color:#666; font-size:.9rem; }
+    .severity-badge { padding:4px 12px; border-radius:15px; font-size:.8rem; font-weight:600; text-transform:uppercase; }
+    .severity-badge.high { background:#fee; color:#c33; }
+    .severity-badge.medium { background:#fff3cd; color:#856404; }
+    .severity-badge.low { background:#d1ecf1; color:#0c5460; }
+    .no-allergies { text-align:center; color:#888; font-style:italic; }
+    @media (max-width:768px){ .severity-options{flex-direction:column;} .nav-links{flex-wrap:wrap;} .allergy-item{flex-direction:column; align-items:flex-start; gap:10px;} }
+  </style>
+</head>
+<body>
+<div class="container">
+  <!-- Header -->
+  <div class="header">
+    <div class="header-content">
+      <h1>Manage Allergies</h1>
+      <p th:text="${'Managing allergic reactions for ' + user.firstName + ' ' + user.lastName}">
+        Managing allergic reactions for John Doe
+      </p>
+    </div>
+  </div>
+
+  <!-- Navigation -->
+  <div class="nav-bar">
+    <div class="nav-links">
+      <a th:href="@{/profile}" class="nav-link">Profile</a>
+      <a href="#" class="nav-link active">Manage Allergies</a>
+      <a th:href="@{/profile}" class="nav-link back-btn">Back to Profile</a>
+    </div>
+  </div>
+
+  <!-- Current Allergies -->
+  <div class="card">
+    <div class="card-header">Current Allergic Reactions</div>
+    <div class="card-body">
+      <div th:if="${healthProfile.allergicReactions != null and not #lists.isEmpty(healthProfile.allergicReactions)}">
+        <div th:each="allergy : ${healthProfile.allergicReactions}" class="allergy-item">
+          <div class="allergy-info">
+            <div class="medicine-name" th:text="${allergy.medicine.medicineName}">Aspirin</div>
+            <div class="allergy-description" th:text="${allergy.description}">Causes severe skin reactions</div>
+          </div>
+          <span th:class="${'severity-badge ' + #strings.toLowerCase(allergy.severity)}"
+                th:text="${allergy.severity}">HIGH</span>
+        </div>
+      </div>
+      <div th:unless="${healthProfile.allergicReactions != null and not #lists.isEmpty(healthProfile.allergicReactions)}" class="no-allergies">
+        No allergic reactions recorded yet.
+      </div>
+    </div>
+  </div>
+
+  <!-- Add New Allergy Form -->
+  <div class="card">
+    <div class="card-header">Add New Allergic Reaction</div>
+    <div class="card-body">
+      <!-- Messages -->
+      <div th:if="${error}" class="alert alert-danger"><span th:text="${error}">Error message</span></div>
+      <div th:if="${success}" class="alert alert-success"><span th:text="${success}">Success message</span></div>
+
+      <form th:action="@{/allergies/add}" method="post" id="allergyForm">
+        <div class="form-group">
+          <label for="medicineId">Medicine</label>
+          <select id="medicineId" name="medicineId" class="form-control" required>
+            <option value="">Select a medicine...</option>
+            <option th:each="medicine : ${medicines}"
+                    th:value="${medicine.id}"
+                    th:text="${medicine.medicineName + ' (' + medicine.activeIngredient + ')'}">
+              Aspirin (Acetylsalicylic acid)
+            </option>
+          </select>
+        </div>
+
+        <div class="form-group">
+          <label for="dateDiagnosed">Date Diagnosed</label>
+          <input type="date" id="dateDiagnosed" name="dateDiagnosed" class="form-control"
+                 th:max="${#temporals.format(#temporals.createNow(), 'yyyy-MM-dd')}" required>
+        </div>
+
+        <div class="form-group">
+          <label for="description">Description</label>
+          <textarea id="description" name="description" class="form-control"
+                    placeholder="Describe the allergic reaction symptoms, triggers, and any additional details..."
+                    required></textarea>
+        </div>
+
+        <div class="form-group">
+          <label>Severity Level</label>
+          <div class="severity-options">
+            <div class="severity-option">
+              <input type="radio" id="low" name="severity" value="LOW" required>
+              <label for="low" class="severity-label low">Low</label>
+            </div>
+            <div class="severity-option">
+              <input type="radio" id="medium" name="severity" value="MEDIUM" required>
+              <label for="medium" class="severity-label medium">Medium</label>
+            </div>
+            <div class="severity-option">
+              <input type="radio" id="high" name="severity" value="HIGH" required>
+              <label for="high" class="severity-label high">High</label>
+            </div>
+          </div>
+        </div>
+
+        <button type="submit" class="btn-submit">Add Allergic Reaction</button>
+      </form>
+    </div>
+  </div>
+</div>
+
+<script>
+  document.getElementById('allergyForm').addEventListener('submit', function() {
+    const btn = this.querySelector('.btn-submit');
+    btn.textContent = 'Adding...';
+    btn.disabled = true;
+  });
+  document.querySelectorAll('input[name="severity"]').forEach(radio => {
+    radio.addEventListener('change', function() {
+      document.querySelectorAll('.severity-label').forEach(label => { label.style.transform = 'scale(1)'; });
+      if (this.checked) this.nextElementSibling.style.transform = 'scale(1.05)';
+    });
+  });
+</script>
+</body>
+</html>
Index: src/main/resources/templates/profile.html
===================================================================
--- src/main/resources/templates/profile.html	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
+++ src/main/resources/templates/profile.html	(revision 7f37d04dd12feb501cdd7bcb4a98e62788fec0d8)
@@ -0,0 +1,419 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>SynergyMed - Profile</title>
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+        }
+
+        body {
+            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+            background: linear-gradient(135deg, #a4ecba 0%, #f7f7f8 100%);
+            min-height: 100vh;
+            padding: 20px;
+        }
+
+        .container {
+            max-width: 1200px;
+            margin: 0 auto;
+        }
+
+        .header {
+            background: white;
+            border-radius: 20px;
+            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+            margin-bottom: 30px;
+            overflow: hidden;
+        }
+
+        .header-content {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color: white;
+            padding: 30px;
+            display: flex;
+            align-items: center;
+            gap: 30px;
+        }
+
+        .profile-picture {
+            width: 120px;
+            height: 120px;
+            border-radius: 50%;
+            /* TODO: Replace with actual profile picture */
+            background: #888;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 48px;
+            font-weight: bold;
+            color: white;
+            flex-shrink: 0;
+            border: 4px solid rgba(255, 255, 255, 0.3);
+        }
+
+        .profile-info h1 {
+            font-size: 2.5rem;
+            font-weight: 300;
+            margin-bottom: 10px;
+        }
+
+        .profile-info p {
+            font-size: 1.1rem;
+            opacity: 0.9;
+            margin-bottom: 5px;
+        }
+
+        .profile-meta {
+            display: flex;
+            gap: 30px;
+            margin-top: 15px;
+        }
+
+        .meta-item {
+            background: rgba(255, 255, 255, 0.2);
+            padding: 10px 20px;
+            border-radius: 25px;
+            font-size: 0.9rem;
+        }
+
+        .nav-bar {
+            background: white;
+            border-radius: 15px;
+            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
+            margin-bottom: 30px;
+            padding: 20px 30px;
+        }
+
+        .nav-links {
+            display: flex;
+            gap: 20px;
+            align-items: center;
+        }
+
+        .nav-link {
+            color: #20b2aa;
+            text-decoration: none;
+            padding: 10px 20px;
+            border-radius: 25px;
+            transition: all 0.3s ease;
+            font-weight: 500;
+        }
+
+        .nav-link:hover, .nav-link.active {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color: white;
+        }
+
+        .main-content {
+            display: grid;
+            grid-template-columns: 1fr 1fr;
+            gap: 30px;
+        }
+
+        .card {
+            background: white;
+            border-radius: 20px;
+            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+            overflow: hidden;
+        }
+
+        .card-header {
+            background: linear-gradient(135deg, #20b2aa, #48d1cc);
+            color: white;
+            padding: 25px 30px;
+            font-size: 1.3rem;
+            font-weight: 600;
+        }
+
+        .card-body {
+            padding: 30px;
+        }
+
+        .info-grid {
+            display: grid;
+            gap: 20px;
+        }
+
+        .info-item {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 15px 0;
+            border-bottom: 1px solid #f0f0f0;
+        }
+
+        .info-item:last-child {
+            border-bottom: none;
+        }
+
+        .info-label {
+            font-weight: 600;
+            color: #555;
+            font-size: 0.95rem;
+        }
+
+        .info-value {
+            color: #333;
+            font-size: 1rem;
+        }
+
+        .blood-type {
+            background: linear-gradient(135deg, #ff6b6b, #ee5a24);
+            color: white;
+            padding: 5px 15px;
+            border-radius: 20px;
+            font-weight: bold;
+            font-size: 0.9rem;
+        }
+
+        .allergy-item {
+            background: #f8f9fa;
+            border-radius: 15px;
+            padding: 20px;
+            margin-bottom: 15px;
+            border-left: 4px solid #20b2aa;
+        }
+
+        .allergy-header {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            margin-bottom: 10px;
+        }
+
+        .medicine-name {
+            font-weight: 600;
+            color: #333;
+            font-size: 1.1rem;
+        }
+
+        .severity {
+            padding: 3px 12px;
+            border-radius: 15px;
+            font-size: 0.8rem;
+            font-weight: 600;
+            text-transform: uppercase;
+        }
+
+        .severity.high {
+            background: #fee;
+            color: #c33;
+        }
+
+        .severity.medium {
+            background: #fff3cd;
+            color: #856404;
+        }
+
+        .severity.low {
+            background: #d1ecf1;
+            color: #0c5460;
+        }
+
+        .allergy-details {
+            color: #666;
+            font-size: 0.9rem;
+            margin-top: 10px;
+        }
+
+        .date-diagnosed {
+            color: #888;
+            font-size: 0.85rem;
+            margin-top: 8px;
+        }
+
+        .no-data {
+            text-align: center;
+            padding: 40px;
+            color: #888;
+        }
+
+        .no-data-icon {
+            font-size: 4rem;
+            margin-bottom: 20px;
+            opacity: 0.3;
+        }
+
+        .logout-btn {
+            margin-left: auto;
+            background: linear-gradient(135deg, #ff6b6b, #ee5a24);
+            color: white;
+            padding: 10px 20px;
+            border-radius: 25px;
+            text-decoration: none;
+            transition: all 0.3s ease;
+            font-weight: 500;
+        }
+
+        .logout-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 5px 15px rgba(238, 90, 36, 0.4);
+        }
+
+        @media (max-width: 768px) {
+            .main-content {
+                grid-template-columns: 1fr;
+            }
+
+            .header-content {
+                flex-direction: column;
+                text-align: center;
+                gap: 20px;
+            }
+
+            .profile-meta {
+                flex-direction: column;
+                gap: 10px;
+                align-items: center;
+            }
+
+            .nav-links {
+                flex-wrap: wrap;
+            }
+
+            .profile-picture {
+                width: 100px;
+                height: 100px;
+                font-size: 40px;
+            }
+
+            .profile-info h1 {
+                font-size: 2rem;
+            }
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+    <!-- Profile Header -->
+    <div class="header">
+        <div class="header-content">
+            <div class="profile-picture">
+                <!-- TODO: Replace with actual profile picture -->
+                <span th:text="${user.firstName.substring(0,1).toUpperCase() + user.lastName.substring(0,1).toUpperCase()}">AB</span>
+            </div>
+            <div class="profile-info">
+                <h1 th:text="${user.firstName + ' ' + user.lastName}">John Doe</h1>
+                <p th:text="'@' + ${username}">@johndoe</p>
+                <p th:text="${user.email}">john.doe@email.com</p>
+                <div class="profile-meta">
+                    <div class="meta-item" th:text="'Member since ' + ${#temporals.format(user.dateCreated, 'MMM yyyy')}">Member since Jan 2024</div>
+                    <div class="meta-item" th:text="'Age ' + ${T(java.time.Period).between(user.dateOfBirth, T(java.time.LocalDate).now()).getYears()}">Age 30</div>
+                    <div class="meta-item" th:text="${user.gender ?: 'Not specified'}">Male</div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Navigation -->
+    <div class="nav-bar">
+        <div class="nav-links">
+            <a href="#" class="nav-link active">Profile</a>
+            <a href="#" class="nav-link">Medical History</a>
+            <a href="/allergies/manage" class="nav-link">Manage Allergies</a>
+            <a href="/login" class="logout-btn">Logout</a>
+        </div>
+    </div>
+
+    <!-- Main Content -->
+    <div class="main-content">
+        <!-- Success/Error Messages -->
+        <div th:if="${success}" class="alert alert-success" style="grid-column: 1 / -1; margin-bottom: 20px;">
+            <span th:text="${success}">Success message</span>
+        </div>
+
+        <div th:if="${error}" class="alert alert-danger" style="grid-column: 1 / -1; margin-bottom: 20px;">
+            <span th:text="${error}">Error message</span>
+        </div>
+
+        <!-- Personal Information Card -->
+        <div class="card">
+            <div class="card-header">
+                Personal Information
+            </div>
+            <div class="card-body">
+                <div class="info-grid">
+                    <div class="info-item">
+                        <span class="info-label">Full Name</span>
+                        <span class="info-value" th:text="${user.firstName + ' ' + user.lastName}">John Doe</span>
+                    </div>
+                    <div class="info-item">
+                        <span class="info-label">Username</span>
+                        <span class="info-value" th:text="${username}">johndoe</span>
+                    </div>
+                    <div class="info-item">
+                        <span class="info-label">Email</span>
+                        <span class="info-value" th:text="${user.email}">john.doe@email.com</span>
+                    </div>
+                    <div class="info-item">
+                        <span class="info-label">Date of Birth</span>
+                        <span class="info-value" th:text="${#temporals.format(user.dateOfBirth, 'dd MMM yyyy')}">15 Jan 1990</span>
+                    </div>
+                    <div class="info-item">
+                        <span class="info-label">Gender</span>
+                        <span class="info-value" th:text="${user.gender ?: 'Not specified'}">Male</span>
+                    </div>
+                    <div class="info-item">
+                        <span class="info-label">Member Since</span>
+                        <span class="info-value" th:text="${#temporals.format(user.dateCreated, 'dd MMM yyyy')}">01 Jan 2024</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Health Profile Card -->
+        <div class="card">
+            <div class="card-header">
+                Health Profile
+            </div>
+            <div class="card-body">
+                <div th:if="${hasHealthProfile}">
+                    <div class="info-item">
+                        <span class="info-label">Blood Type</span>
+                        <span class="blood-type" th:text="${healthProfile.bloodType}">O+</span>
+                    </div>
+
+                    <div style="margin-top: 30px;">
+                        <h3 style="color: #333; margin-bottom: 20px; font-size: 1.2rem;">Allergic Reactions</h3>
+
+                        <div th:if="${healthProfile.allergicReactions != null and not #lists.isEmpty(healthProfile.allergicReactions)}">
+                            <div th:each="allergy : ${healthProfile.allergicReactions}" class="allergy-item">
+                                <div class="allergy-header">
+                                    <span class="medicine-name" th:text="${allergy.medicine.medicineName}">Aspirin</span>
+                                    <span class="severity"
+                                          th:class="'severity ' + ${#strings.toLowerCase(allergy.severity)}"
+                                          th:text="${allergy.severity}">HIGH</span>
+                                </div>
+                                <div class="allergy-details" th:text="${allergy.description}">
+                                    Causes severe skin reactions and difficulty breathing
+                                </div>
+                                <div class="date-diagnosed">
+                                    Diagnosed: <span th:text="${#temporals.format(allergy.dateDiagnosed, 'dd MMM yyyy')}">15 Jan 2023</span>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div th:unless="${healthProfile.allergicReactions != null and not #lists.isEmpty(healthProfile.allergicReactions)}" class="no-data">
+                            <div class="no-data-icon">🏥</div>
+                            <p>No allergic reactions recorded</p>
+                            <small>Your medical history appears clean!</small>
+                        </div>
+                    </div>
+                </div>
+
+                <div th:unless="${hasHealthProfile}" class="no-data">
+                    <div class="no-data-icon">📋</div>
+                    <p>No health profile found</p>
+                    <small>Contact your healthcare provider to create a health profile.</small>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+</html>
