Index: pom.xml
===================================================================
--- pom.xml	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ pom.xml	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -64,10 +64,4 @@
 		</dependency>
 		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-docker-compose</artifactId>
-			<scope>runtime</scope>
-			<optional>true</optional>
-		</dependency>
-		<dependency>
 			<groupId>org.postgresql</groupId>
 			<artifactId>postgresql</artifactId>
@@ -77,5 +71,6 @@
 			<groupId>org.projectlombok</groupId>
 			<artifactId>lombok</artifactId>
-			<optional>true</optional>
+			<version>1.18.32</version>
+			<scope>provided</scope>
 		</dependency>
 		<dependency>
@@ -132,4 +127,5 @@
 							<groupId>org.projectlombok</groupId>
 							<artifactId>lombok</artifactId>
+							<version>1.18.32</version>
 						</path>
 					</annotationProcessorPaths>
Index: src/main/java/mk/ukim/finki/synergymed/config/StaticResourceConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/config/StaticResourceConfig.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/config/StaticResourceConfig.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.synergymed.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class StaticResourceConfig implements WebMvcConfigurer {
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // Serves files from the working directory's ./uploads/... at /uploads/**
+        registry.addResourceHandler("/uploads/**")
+                .addResourceLocations("file:uploads/"); // relative to app working dir or container workdir
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/models/Brandedmedicineimage.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/Brandedmedicineimage.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/models/Brandedmedicineimage.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -22,3 +22,6 @@
     private String image;
 
+    // New flag for “main” image
+    @Column(name = "is_main_image", nullable = false)
+    private boolean mainImage = false;
 }
Index: src/main/java/mk/ukim/finki/synergymed/models/Deliverycompany.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/Deliverycompany.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/models/Deliverycompany.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -11,5 +11,4 @@
 public class Deliverycompany {
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "company_id", nullable = false)
     private Integer id;
Index: src/main/java/mk/ukim/finki/synergymed/models/Distributor.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/Distributor.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/models/Distributor.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -11,5 +11,4 @@
 public class Distributor {
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "company_id", nullable = false)
     private Integer id;
Index: src/main/java/mk/ukim/finki/synergymed/models/Manufacturer.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/Manufacturer.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/models/Manufacturer.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -11,5 +11,4 @@
 public class Manufacturer {
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "company_id", nullable = false)
     private Integer id;
Index: src/main/java/mk/ukim/finki/synergymed/models/Pharmacy.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/Pharmacy.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/models/Pharmacy.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -11,5 +11,4 @@
 public class Pharmacy {
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "company_id", nullable = false)
     private Integer id;
Index: src/main/java/mk/ukim/finki/synergymed/models/enumerations/CompanyRoleType.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/enumerations/CompanyRoleType.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/models/enumerations/CompanyRoleType.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,10 @@
+package mk.ukim.finki.synergymed.models.enumerations;
+
+
+public enum CompanyRoleType {
+    DISTRIBUTOR,
+    MANUFACTURER,
+    PHARMACY,
+
+    DELIVERYCOMPANY
+}
Index: src/main/java/mk/ukim/finki/synergymed/repositories/BrandedmedicineimageRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/repositories/BrandedmedicineimageRepository.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/repositories/BrandedmedicineimageRepository.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -4,4 +4,22 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+import java.util.Optional;
+
 public interface BrandedmedicineimageRepository extends JpaRepository<Brandedmedicineimage, Integer> {
+
+    // List all images for a branded medicine
+    List<Brandedmedicineimage> findByBrandedMedicineId(Integer brandedMedicineId);
+
+    // Same, ordered by id
+    List<Brandedmedicineimage> findByBrandedMedicineIdOrderByIdAsc(Integer brandedMedicineId);
+
+    // First image by id (fallback thumbnail)
+    Optional<Brandedmedicineimage> findFirstByBrandedMedicineIdOrderByIdAsc(Integer brandedMedicineId);
+
+    // “Main” image for a branded medicine (thumbnail of choice)
+    Optional<Brandedmedicineimage> findFirstByBrandedMedicineIdAndMainImageTrue(Integer brandedMedicineId);
+
+    // Existence of any “main” image for a branded medicine
+    boolean existsByBrandedMedicineIdAndMainImageTrue(Integer brandedMedicineId);
 }
Index: src/main/java/mk/ukim/finki/synergymed/service/BrandedMedicineService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/BrandedMedicineService.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/service/BrandedMedicineService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -1,5 +1,36 @@
 package mk.ukim.finki.synergymed.service;
 
+import mk.ukim.finki.synergymed.models.Brandedmedicine;
+import mk.ukim.finki.synergymed.models.Brandedmedicineimage;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
 public interface BrandedMedicineService {
+    List<Brandedmedicine> findAll();
+    Optional<Brandedmedicine> findById(Integer id);
 
+    void deleteById(Integer id) throws IOException;
+
+    // New service methods so controllers don’t call repositories
+    List<Brandedmedicineimage> listImages(Integer brandedMedicineId);
+    String cardImageUrl(Integer brandedMedicineId); // main image or fallback
+    Map<Integer,String> cardImageUrlsFor(List<Brandedmedicine> medicines);
+
+    void saveAll(Integer id,
+            Integer manufacturerId,
+            BigDecimal price,
+            String description,
+            String dosageForm,
+            String strength,
+            String originCountry,
+            String name,
+            MultipartFile[] newImages,
+            List<Integer> removeImageIds,
+            Integer mainExistingId,
+            Integer mainNewIndex) throws IOException;
 }
Index: src/main/java/mk/ukim/finki/synergymed/service/CompanyOrchestrationService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/CompanyOrchestrationService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/CompanyOrchestrationService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,15 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.models.enumerations.CompanyRoleType;
+
+import java.util.List;
+
+public interface CompanyOrchestrationService {
+    Company createCompanyWithRoles(
+            String companyName,
+            String description,
+            String registrationNumber,
+            List<CompanyRoleType> roles
+    );
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/CompanyService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/CompanyService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/CompanyService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Company;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface CompanyService {
+    List<Company> findAll();
+    Optional<Company> findById(Integer id);
+    Company save(String companyName, String description, String registrationNumber);
+    Company update(Integer id, String companyName, String description, String registrationNumber);
+    void deleteById(Integer id);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/DeliveryCompanyService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/DeliveryCompanyService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/DeliveryCompanyService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Deliverycompany;
+import mk.ukim.finki.synergymed.models.Distributor;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface DeliveryCompanyService {
+    List<Deliverycompany> findAll();
+    Optional<Deliverycompany> findById(Integer companyId);
+    Deliverycompany create(Integer companyId);
+    void deleteById(Integer companyId);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/DistributorService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/DistributorService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/DistributorService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Distributor;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface DistributorService {
+    List<Distributor> findAll();
+    Optional<Distributor> findById(Integer companyId);
+    Distributor create(Integer companyId);
+    void deleteById(Integer companyId);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/ManufacturerService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/ManufacturerService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/ManufacturerService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Manufacturer;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface ManufacturerService {
+    List<Manufacturer> findAll();
+    Optional<Manufacturer> findById(Integer companyId);
+    Manufacturer create(Integer companyId);
+    void deleteById(Integer companyId);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/MedicineService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/MedicineService.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/service/MedicineService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -7,6 +7,11 @@
 
 import java.util.List;
+import java.util.Optional;
 
 public interface MedicineService {
+    Optional<Medicine> findById(Integer id);
+
+    List<Medicine> findAll();
+    Medicine save(String medicineName,String activeIngredients);
 
     List<Medicine> findAllMedicine();
@@ -15,3 +20,6 @@
     List<Medicineinteraction> interactions(String medicineName);
     Medicineinteraction addInteraction(Medicine medicine1, Medicine medicine2, String type, String description, String severity);
+    Medicine update(Integer id, String medicineName, String activeIngredients);
+
+    void deleteById(Integer id);
 }
Index: src/main/java/mk/ukim/finki/synergymed/service/PharmacyService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/PharmacyService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/PharmacyService.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.synergymed.service;
+
+import mk.ukim.finki.synergymed.models.Pharmacy;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface PharmacyService {
+    List<Pharmacy> findAll();
+    Optional<Pharmacy> findById(Integer companyId);
+    Pharmacy create(Integer companyId);
+    void deleteById(Integer companyId);
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/BrandedMedicineServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/BrandedMedicineServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/BrandedMedicineServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,235 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Brandedmedicine;
+import mk.ukim.finki.synergymed.models.Brandedmedicineimage;
+import mk.ukim.finki.synergymed.models.Manufacturer;
+import mk.ukim.finki.synergymed.repositories.BrandedmedicineRepository;
+import mk.ukim.finki.synergymed.repositories.BrandedmedicineimageRepository;
+import mk.ukim.finki.synergymed.repositories.ManufacturerRepository;
+import mk.ukim.finki.synergymed.service.BrandedMedicineService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.nio.file.*;
+import java.util.*;
+
+@Service
+public class BrandedMedicineServiceImpl implements BrandedMedicineService {
+
+    private final BrandedmedicineRepository brandedMedicineRepository;
+    private final BrandedmedicineimageRepository brandedMedicineImageRepository;
+    private final ManufacturerRepository manufacturerRepository;
+
+    @Value("${app.upload.branded-medicine-dir:uploads/images/branded_medicine/}")
+    private String uploadDir;
+
+    private static final List<String> ALLOWED_EXTENSIONS =
+            Arrays.asList("jpg","jpeg","png","gif","webp");
+    private static final long MAX_FILE_SIZE = 5 * 1024 * 1024;
+
+    public BrandedMedicineServiceImpl(BrandedmedicineRepository brandedMedicineRepository,
+                                      BrandedmedicineimageRepository brandedMedicineImageRepository,
+                                      ManufacturerRepository manufacturerRepository) {
+        this.brandedMedicineRepository = brandedMedicineRepository;
+        this.brandedMedicineImageRepository = brandedMedicineImageRepository;
+        this.manufacturerRepository = manufacturerRepository;
+    }
+
+    @Override
+    public List<Brandedmedicine> findAll() {
+        return brandedMedicineRepository.findAll();
+    }
+
+    @Override
+    public Optional<Brandedmedicine> findById(Integer id) {
+        return brandedMedicineRepository.findById(id);
+    }
+
+    @Override
+    public List<Brandedmedicineimage> listImages(Integer brandedMedicineId) {
+        return brandedMedicineImageRepository.findByBrandedMedicineIdOrderByIdAsc(brandedMedicineId);
+    }
+
+    @Override
+    public String cardImageUrl(Integer brandedMedicineId) {
+        return brandedMedicineImageRepository.findFirstByBrandedMedicineIdAndMainImageTrue(brandedMedicineId)
+                .map(Brandedmedicineimage::getImage)
+                .orElseGet(() -> brandedMedicineImageRepository
+                        .findFirstByBrandedMedicineIdOrderByIdAsc(brandedMedicineId)
+                        .map(Brandedmedicineimage::getImage)
+                        .orElse("/images/placeholder.png"));
+    }
+
+    @Override
+    public Map<Integer, String> cardImageUrlsFor(List<Brandedmedicine> medicines) {
+        Map<Integer,String> map = new HashMap<>();
+        for (Brandedmedicine bm : medicines) {
+            String url = cardImageUrl(bm.getId());
+            if (!url.startsWith("/")) url = "/" + url;
+            map.put(bm.getId(), url);
+        }
+        return map;
+    }
+
+    @Override
+    @Transactional
+    public void saveAll(Integer id,
+                        Integer manufacturerId,
+                        BigDecimal price,
+                        String description,
+                        String dosageForm,
+                        String strength,
+                        String originCountry,
+                        String name,
+                        MultipartFile[] newImages,
+                        List<Integer> removeImageIds,
+                        Integer mainExistingId,
+                        Integer mainNewIndex) throws IOException {
+
+        Brandedmedicine bm;
+        if (id == null) {
+            bm = new Brandedmedicine();
+        } else {
+            bm = brandedMedicineRepository.findById(id)
+                    .orElseThrow(() -> new EntityNotFoundException("Branded medicine not found: " + id));
+        }
+
+        Manufacturer m = manufacturerRepository.findById(manufacturerId)
+                .orElseThrow(() -> new EntityNotFoundException("Manufacturer not found: " + manufacturerId));
+        bm.setManufacturer(m);
+        bm.setPrice(price);
+        bm.setDescription(description);
+        bm.setDosageForm(dosageForm);
+        bm.setStrength(strength);
+        bm.setOriginCountry(originCountry);
+        bm.setName(name);
+
+        Brandedmedicine saved = brandedMedicineRepository.save(bm);
+
+        if (removeImageIds != null && !removeImageIds.isEmpty()) {
+            List<Brandedmedicineimage> toRemove = brandedMedicineImageRepository.findAllById(removeImageIds);
+            for (Brandedmedicineimage img : toRemove) {
+                if (!Objects.equals(img.getBrandedMedicine().getId(), saved.getId())) continue;
+                deletePhysicalFileIfExists(img.getImage());
+            }
+            brandedMedicineImageRepository.deleteAll(toRemove);
+        }
+
+        List<Brandedmedicineimage> appended = new ArrayList<>();
+        if (newImages != null) {
+            Path base = ensureUploadPath();
+            long ts = System.currentTimeMillis();
+            int seq = 0;
+            for (MultipartFile file : newImages) {
+                if (file == null || file.isEmpty()) continue;
+                validateImageFile(file);
+
+                String original = Optional.ofNullable(file.getOriginalFilename()).orElse("image");
+                String ext = getFileExtension(original).toLowerCase(Locale.ROOT);
+                String filename = String.format("branded_medicine_%d_%d_%03d.%s", saved.getId(), ts, ++seq, ext);
+
+                Path dest = base.resolve(filename);
+                Files.copy(file.getInputStream(), dest, StandardCopyOption.REPLACE_EXISTING);
+
+                String url = "/uploads/images/branded_medicine/" + filename;
+
+                Brandedmedicineimage img = new Brandedmedicineimage();
+                img.setBrandedMedicine(saved);
+                img.setImage(url);
+                img.setMainImage(false);
+                appended.add(brandedMedicineImageRepository.save(img));
+            }
+        }
+
+        Integer targetMainId = null;
+
+        if (mainExistingId != null) {
+            brandedMedicineImageRepository.findById(mainExistingId).ifPresent(img -> {
+                if (Objects.equals(img.getBrandedMedicine().getId(), saved.getId())) {
+                    // capture via array holder
+                }
+            });
+            if (brandedMedicineImageRepository.findById(mainExistingId)
+                    .filter(img -> Objects.equals(img.getBrandedMedicine().getId(), saved.getId()))
+                    .isPresent()) {
+                targetMainId = mainExistingId;
+            }
+        }
+
+        if (targetMainId == null && mainNewIndex != null) {
+            if (mainNewIndex >= 0 && mainNewIndex < appended.size()) {
+                targetMainId = appended.get(mainNewIndex).getId();
+            }
+        }
+
+        if (targetMainId == null) {
+            Optional<Brandedmedicineimage> curMain = brandedMedicineImageRepository
+                    .findFirstByBrandedMedicineIdAndMainImageTrue(saved.getId());
+            if (curMain.isPresent()) {
+                targetMainId = curMain.get().getId();
+            } else {
+                targetMainId = brandedMedicineImageRepository
+                        .findFirstByBrandedMedicineIdOrderByIdAsc(saved.getId())
+                        .map(Brandedmedicineimage::getId).orElse(null);
+            }
+        }
+
+        if (targetMainId != null) {
+            List<Brandedmedicineimage> all = brandedMedicineImageRepository.findByBrandedMedicineId(saved.getId());
+            for (Brandedmedicineimage img : all) {
+                boolean shouldBeMain = Objects.equals(img.getId(), targetMainId);
+                if (img.isMainImage() != shouldBeMain) {
+                    img.setMainImage(shouldBeMain);
+                    brandedMedicineImageRepository.save(img);
+                }
+            }
+        }
+    }
+    @Override
+    @Transactional
+    public void deleteById(Integer id) throws IOException {
+        List<Brandedmedicineimage> imgs = brandedMedicineImageRepository.findByBrandedMedicineId(id);
+        for (Brandedmedicineimage img : imgs) {
+            deletePhysicalFileIfExists(img.getImage());
+        }
+
+        brandedMedicineImageRepository.deleteAll(imgs);
+
+        brandedMedicineRepository.deleteById(id);
+    }
+
+
+    private Path ensureUploadPath() throws IOException {
+        Path p = Paths.get(uploadDir);
+        if (!Files.exists(p)) Files.createDirectories(p);
+        return p;
+    }
+
+
+    private void deletePhysicalFileIfExists(String storedUrl) throws IOException {
+        if (storedUrl == null || storedUrl.isBlank()) return;
+        String fileName = Paths.get(storedUrl).getFileName().toString();
+        Path onDisk = Paths.get(uploadDir).resolve(fileName);
+        if (Files.exists(onDisk)) Files.delete(onDisk);
+    }
+
+    private void validateImageFile(MultipartFile file) throws IOException {
+        if (file.getSize() > MAX_FILE_SIZE) throw new IOException("File exceeds 5MB");
+        String name = file.getOriginalFilename();
+        if (name == null || name.isEmpty()) throw new IOException("Invalid filename");
+        String ext = getFileExtension(name).toLowerCase(Locale.ROOT);
+        if (!ALLOWED_EXTENSIONS.contains(ext)) throw new IOException("Not an allowed image type");
+        String ct = file.getContentType();
+        if (ct == null || !ct.startsWith("image/")) throw new IOException("Not an image");
+    }
+
+    private String getFileExtension(String filename) {
+        int i = filename.lastIndexOf('.');
+        return i == -1 ? "" : filename.substring(i + 1);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyOrchestrationServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyOrchestrationServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyOrchestrationServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,49 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.models.enumerations.CompanyRoleType;
+import mk.ukim.finki.synergymed.service.*;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class CompanyOrchestrationServiceImpl implements CompanyOrchestrationService {
+
+    private final CompanyService companyService;
+    private final DistributorService distributorService;
+    private final ManufacturerService manufacturerService;
+    private final PharmacyService pharmacyService;
+
+    public  CompanyOrchestrationServiceImpl(CompanyService companyService,
+                                    DistributorService distributorService,
+                                    ManufacturerService manufacturerService,
+                                    PharmacyService pharmacyService) {
+        this.companyService = companyService;
+        this.distributorService = distributorService;
+        this.manufacturerService = manufacturerService;
+        this.pharmacyService = pharmacyService;
+    }
+
+    @Override
+    @Transactional
+    public Company createCompanyWithRoles(
+            String companyName,
+            String description,
+            String registrationNumber,
+            List<CompanyRoleType> roles
+    ) {
+        Company company = companyService.save(companyName, description, registrationNumber);
+        if (roles != null) {
+            for (CompanyRoleType role : roles) {
+                switch (role) {
+                    case DISTRIBUTOR -> distributorService.create(company.getId());
+                    case MANUFACTURER -> manufacturerService.create(company.getId());
+                    case PHARMACY -> pharmacyService.create(company.getId());
+                }
+            }
+        }
+        return company;
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,58 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.repositories.CompanyRepository;
+import mk.ukim.finki.synergymed.service.CompanyService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+    private final CompanyRepository companyRepository;
+
+    public CompanyServiceImpl(CompanyRepository companyRepository) {
+        this.companyRepository = companyRepository;
+    }
+
+    @Override
+    public List<Company> findAll() {
+        return companyRepository.findAll();
+    }
+
+    @Override
+    public Optional<Company> findById(Integer id) {
+        return companyRepository.findById(id);
+    }
+
+    @Override
+    @Transactional
+    public Company save(String companyName, String description, String registrationNumber) {
+        Company c = new Company();
+        c.setCompanyName(companyName);
+        c.setDescription(description);
+        c.setRegistrationNumber(registrationNumber);
+        return companyRepository.save(c);
+    }
+
+    @Override
+    @Transactional
+    public Company update(Integer id, String companyName, String description, String registrationNumber) {
+        Company c = companyRepository.findById(id)
+                .orElseThrow(() -> new EntityNotFoundException("Company not found: " + id));
+        c.setCompanyName(companyName);
+        c.setDescription(description);
+        c.setRegistrationNumber(registrationNumber);
+        return companyRepository.save(c);
+    }
+
+    @Override
+    @Transactional
+    public void deleteById(Integer id) {
+        companyRepository.deleteById(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/DeliveryCompanyServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/DeliveryCompanyServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/DeliveryCompanyServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,59 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.models.Deliverycompany;
+import mk.ukim.finki.synergymed.repositories.CompanyRepository;
+import mk.ukim.finki.synergymed.repositories.DeliverycompanyRepository;
+import mk.ukim.finki.synergymed.service.DeliveryCompanyService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class DeliveryCompanyServiceImpl implements DeliveryCompanyService {
+
+    private final DeliverycompanyRepository deliveryCompanyRepository;
+    private final CompanyRepository companyRepository;
+
+    public DeliveryCompanyServiceImpl(DeliverycompanyRepository deliveryCompanyRepository,
+                                      CompanyRepository companyRepository) {
+        this.deliveryCompanyRepository = deliveryCompanyRepository;
+        this.companyRepository = companyRepository;
+    }
+
+    @Override
+    public List<Deliverycompany> findAll() {
+        return deliveryCompanyRepository.findAll();
+    }
+
+    @Override
+    public Optional<Deliverycompany> findById(Integer companyId) {
+        return deliveryCompanyRepository.findById(companyId);
+    }
+
+    @Override
+    @Transactional
+    public Deliverycompany create(Integer companyId) {
+        if (deliveryCompanyRepository.existsById(companyId)) {
+            throw new IllegalStateException("Delivery company already exists for company " + companyId);
+        }
+
+        Company company = companyRepository.findById(companyId)
+                .orElseThrow(() -> new EntityNotFoundException("Company not found: " + companyId));
+
+        Deliverycompany dc = new Deliverycompany();
+        // If Deliverycompany uses @MapsId on its company mapping, this copies company.id into deliverycompany.id
+        dc.setCompany(company);
+
+        return deliveryCompanyRepository.save(dc);
+    }
+
+    @Override
+    @Transactional
+    public void deleteById(Integer companyId) {
+        deliveryCompanyRepository.deleteById(companyId);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/DistributorServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/DistributorServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/DistributorServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,55 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.models.Distributor;
+import mk.ukim.finki.synergymed.repositories.CompanyRepository;
+import mk.ukim.finki.synergymed.repositories.DistributorRepository;
+import mk.ukim.finki.synergymed.service.DistributorService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class DistributorServiceImpl implements DistributorService {
+
+    private final DistributorRepository distributorRepository;
+    private final CompanyRepository companyRepository;
+
+    public DistributorServiceImpl(DistributorRepository distributorRepository,
+                                  CompanyRepository companyRepository) {
+        this.distributorRepository = distributorRepository;
+        this.companyRepository = companyRepository;
+    }
+
+    @Override
+    public List<Distributor> findAll() {
+        return distributorRepository.findAll();
+    }
+
+    @Override
+    public Optional<Distributor> findById(Integer companyId) {
+        return distributorRepository.findById(companyId);
+    }
+
+    @Override
+    @Transactional
+    public Distributor create(Integer companyId) {
+        if (distributorRepository.existsById(companyId)) {
+            throw new IllegalStateException("Distributor already exists for company " + companyId);
+        }
+        Company company = companyRepository.findById(companyId)
+                .orElseThrow(() -> new EntityNotFoundException("Company not found: " + companyId));
+        Distributor d = new Distributor();
+        d.setCompany(company); // @MapsId copies company.id into distributor.id
+        return distributorRepository.save(d);
+    }
+
+    @Override
+    @Transactional
+    public void deleteById(Integer companyId) {
+        distributorRepository.deleteById(companyId);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/ManufacturerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/ManufacturerServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/ManufacturerServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,55 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.models.Manufacturer;
+import mk.ukim.finki.synergymed.repositories.CompanyRepository;
+import mk.ukim.finki.synergymed.repositories.ManufacturerRepository;
+import mk.ukim.finki.synergymed.service.ManufacturerService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class ManufacturerServiceImpl implements ManufacturerService {
+
+    private final ManufacturerRepository manufacturerRepository;
+    private final CompanyRepository companyRepository;
+
+    public ManufacturerServiceImpl(ManufacturerRepository manufacturerRepository,
+                                   CompanyRepository companyRepository) {
+        this.manufacturerRepository = manufacturerRepository;
+        this.companyRepository = companyRepository;
+    }
+
+    @Override
+    public List<Manufacturer> findAll() {
+        return manufacturerRepository.findAll();
+    }
+
+    @Override
+    public Optional<Manufacturer> findById(Integer companyId) {
+        return manufacturerRepository.findById(companyId);
+    }
+
+    @Override
+    @Transactional
+    public Manufacturer create(Integer companyId) {
+        if (manufacturerRepository.existsById(companyId)) {
+            throw new IllegalStateException("Manufacturer already exists for company " + companyId);
+        }
+        Company company = companyRepository.findById(companyId)
+                .orElseThrow(() -> new EntityNotFoundException("Company not found: " + companyId));
+        Manufacturer m = new Manufacturer();
+        m.setCompany(company); // @MapsId copies company.id into manufacturer.id
+        return manufacturerRepository.save(m);
+    }
+
+    @Override
+    @Transactional
+    public void deleteById(Integer companyId) {
+        manufacturerRepository.deleteById(companyId);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/MedicineServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/MedicineServiceImpl.java	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/MedicineServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -15,4 +15,11 @@
 
 import java.util.ArrayList;
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Medicine;
+import mk.ukim.finki.synergymed.repositories.MedicineRepository;
+import mk.ukim.finki.synergymed.service.MedicineService;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
@@ -102,3 +109,45 @@
 
     }
+public class MedicineServiceImpl implements MedicineService {
+
+    private final MedicineRepository medicineRepository;
+
+    public MedicineServiceImpl(MedicineRepository medicineRepository) {
+        this.medicineRepository = medicineRepository;
+    }
+
+    @Override
+    public List<Medicine> findAll() {
+        return this.medicineRepository.findAll();
+    }
+
+    @Override
+    public Optional<Medicine> findById(Integer id) {
+        return this.medicineRepository.findById(id);
+    }
+
+    @Override
+    public Medicine save(String medicineName, String activeIngredients){
+        Medicine medicine = new Medicine();
+        medicine.setMedicineName(medicineName);
+        medicine.setActiveIngredient(activeIngredients);
+        return this.medicineRepository.save(medicine);
+    }
+
+    @Override
+    public Medicine update(Integer id, String medicineName, String activeIngredients) {
+        Medicine medicine = this.medicineRepository.findById(id)
+                .orElseThrow(() -> new EntityNotFoundException("Medicine not found: " + id));
+
+        medicine.setMedicineName(medicineName);
+        medicine.setActiveIngredient(activeIngredients);
+
+        return this.medicineRepository.save(medicine);
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        this.medicineRepository.deleteById(id);
+    }
+
 }
Index: src/main/java/mk/ukim/finki/synergymed/service/impl/PharmacyServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/PharmacyServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/PharmacyServiceImpl.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,55 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.models.Pharmacy;
+import mk.ukim.finki.synergymed.repositories.CompanyRepository;
+import mk.ukim.finki.synergymed.repositories.PharmacyRepository;
+import mk.ukim.finki.synergymed.service.PharmacyService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class PharmacyServiceImpl implements PharmacyService {
+
+    private final PharmacyRepository pharmacyRepository;
+    private final CompanyRepository companyRepository;
+
+    public PharmacyServiceImpl(PharmacyRepository pharmacyRepository,
+                               CompanyRepository companyRepository) {
+        this.pharmacyRepository = pharmacyRepository;
+        this.companyRepository = companyRepository;
+    }
+
+    @Override
+    public List<Pharmacy> findAll() {
+        return pharmacyRepository.findAll();
+    }
+
+    @Override
+    public Optional<Pharmacy> findById(Integer companyId) {
+        return pharmacyRepository.findById(companyId);
+    }
+
+    @Override
+    @Transactional
+    public Pharmacy create(Integer companyId) {
+        if (pharmacyRepository.existsById(companyId)) {
+            throw new IllegalStateException("Pharmacy already exists for company " + companyId);
+        }
+        Company company = companyRepository.findById(companyId)
+                .orElseThrow(() -> new EntityNotFoundException("Company not found: " + companyId));
+        Pharmacy p = new Pharmacy();
+        p.setCompany(company); // @MapsId copies company.id into pharmacy.id
+        return pharmacyRepository.save(p);
+    }
+
+    @Override
+    @Transactional
+    public void deleteById(Integer companyId) {
+        pharmacyRepository.deleteById(companyId);
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/web/BrandedMedicineController.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/web/BrandedMedicineController.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/web/BrandedMedicineController.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,96 @@
+package mk.ukim.finki.synergymed.web;
+
+import jakarta.persistence.EntityNotFoundException;
+import mk.ukim.finki.synergymed.models.Brandedmedicine;
+import mk.ukim.finki.synergymed.models.Brandedmedicineimage;
+import mk.ukim.finki.synergymed.service.BrandedMedicineService;
+import mk.ukim.finki.synergymed.service.ManufacturerService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping({"/","branded-medicines"})
+public class BrandedMedicineController {
+
+    private final BrandedMedicineService brandedMedicineService;
+    private final ManufacturerService manufacturerService;
+
+    public BrandedMedicineController(BrandedMedicineService brandedMedicineService,
+                                     ManufacturerService manufacturerService) {
+        this.brandedMedicineService = brandedMedicineService;
+        this.manufacturerService = manufacturerService;
+    }
+
+    @GetMapping
+    public String index(Model model) {
+        List<Brandedmedicine> medicines = brandedMedicineService.findAll();
+        Map<Integer, String> firstImageById = brandedMedicineService.cardImageUrlsFor(medicines);
+        model.addAttribute("medicines", medicines);
+        model.addAttribute("firstImageById", firstImageById);
+        return "index";
+    }
+
+    @GetMapping("/branded-medicines/new")
+    public String createForm(Model model) {
+        model.addAttribute("manufacturers", manufacturerService.findAll());
+        model.addAttribute("mode", "create");
+        return "branded-medicine-form";
+    }
+
+    @GetMapping("/branded-medicines/{id}/edit")
+    public String editForm(@PathVariable Integer id, Model model) {
+        Brandedmedicine bm = brandedMedicineService.findById(id)
+                .orElseThrow(() -> new EntityNotFoundException("Branded medicine not found: " + id));
+        List<Brandedmedicineimage> images = brandedMedicineService.listImages(id);
+
+        model.addAttribute("bm", bm);
+        model.addAttribute("manufacturers", manufacturerService.findAll());
+        model.addAttribute("images", images);
+        model.addAttribute("mode", "edit");
+        return "branded-medicine-form";
+    }
+
+    @PostMapping("/branded-medicines/save")
+    public String save(
+            @RequestParam(required = false) Integer id,
+            @RequestParam Integer manufacturerId,
+            @RequestParam BigDecimal price,
+            @RequestParam(required = false) String description,
+            @RequestParam String dosageForm,
+            @RequestParam String strength,
+            @RequestParam(required = false) String originCountry,
+            @RequestParam String name,
+
+            @RequestParam(name = "images", required = false) MultipartFile[] images,
+            @RequestParam(name = "removeImageIds", required = false) List<Integer> removeImageIds,
+
+            @RequestParam(name = "mainExistingId", required = false) String mainExistingIdStr,
+            @RequestParam(name = "mainNewIndex",   required = false) String mainNewIndexStr
+    ) throws IOException {
+
+        Integer mainExistingId = (mainExistingIdStr != null && mainExistingIdStr.matches("^\\d+$"))
+                ? Integer.valueOf(mainExistingIdStr) : null;
+        Integer mainNewIndex   = (mainNewIndexStr   != null && mainNewIndexStr.matches("^\\d+$"))
+                ? Integer.valueOf(mainNewIndexStr) : null;
+
+        brandedMedicineService.saveAll(
+                id, manufacturerId, price, description, dosageForm, strength, originCountry, name,
+                images, removeImageIds, mainExistingId, mainNewIndex
+        );
+        return "redirect:/";
+    }
+
+
+    @PostMapping("/branded-medicines/{id}/delete")
+    public String deleteBrandedMedicine(@PathVariable Integer id) throws IOException {
+        brandedMedicineService.deleteById(id);
+        return "redirect:/";
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/web/CompanyController.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/web/CompanyController.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/java/mk/ukim/finki/synergymed/web/CompanyController.java	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,144 @@
+package mk.ukim.finki.synergymed.web;
+
+import mk.ukim.finki.synergymed.models.Company;
+import mk.ukim.finki.synergymed.models.enumerations.CompanyRoleType;
+import mk.ukim.finki.synergymed.service.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import java.util.*;
+
+@Controller
+@RequestMapping("/companies")
+public class CompanyController {
+
+    private final CompanyService companyService;
+    private final CompanyOrchestrationService companyOrchestrationService;
+    private final DistributorService distributorService;
+    private final ManufacturerService manufacturerService;
+    private final PharmacyService pharmacyService;
+    private final DeliveryCompanyService deliveryCompanyService;
+
+    public CompanyController(CompanyService companyService,
+                             CompanyOrchestrationService companyOrchestrationService,
+                             DistributorService distributorService,
+                             ManufacturerService manufacturerService,
+                             PharmacyService pharmacyService,
+                             DeliveryCompanyService deliveryCompanyService) {
+        this.companyService = companyService;
+        this.companyOrchestrationService = companyOrchestrationService;
+        this.distributorService = distributorService;
+        this.manufacturerService = manufacturerService;
+        this.pharmacyService = pharmacyService;
+        this.deliveryCompanyService = deliveryCompanyService;
+    }
+
+    // Grid of companies
+    @GetMapping
+    public String index(Model model) {
+        List<Company> companies = companyService.findAll();
+        Map<Integer, List<CompanyRoleType>> rolesByCompany = new HashMap<>();
+        for (Company c : companies) {
+            List<CompanyRoleType> roles = new ArrayList<>();
+            if (distributorService.findById(c.getId()).isPresent()) roles.add(CompanyRoleType.DISTRIBUTOR);
+            if (manufacturerService.findById(c.getId()).isPresent()) roles.add(CompanyRoleType.MANUFACTURER);
+            if (pharmacyService.findById(c.getId()).isPresent()) roles.add(CompanyRoleType.PHARMACY);
+            try {
+                if (deliveryCompanyService.findById(c.getId()).isPresent()) {
+                    roles.add(CompanyRoleType.valueOf("DELIVERYCOMPANY"));
+                }
+            } catch (IllegalArgumentException ignored) {}
+            rolesByCompany.put(c.getId(), roles);
+        }
+        model.addAttribute("companies", companies);
+        model.addAttribute("rolesByCompany", rolesByCompany);
+        return "companies";
+    }
+
+    // Create form
+    @GetMapping("/new")
+    public String createForm(Model model) {
+        model.addAttribute("roleTypes", CompanyRoleType.values()); // checkboxes shown only on create
+        model.addAttribute("mode", "create");
+        return "company-form";
+    }
+
+    // Create with roles
+    @PostMapping
+    public String create(@RequestParam String companyName,
+                         @RequestParam(required = false) String description,
+                         @RequestParam String registrationNumber,
+                         @RequestParam(name = "roles", required = false) List<CompanyRoleType> roles,
+                         RedirectAttributes ra) {
+        Company saved = companyOrchestrationService.createCompanyWithRoles(
+                companyName, description, registrationNumber, roles == null ? List.of() : roles
+        );
+        ra.addFlashAttribute("message", "Company created: " + saved.getCompanyName());
+        return "redirect:/companies";
+    }
+
+    // GET /companies/{id}/edit — pre-check roles using current DB state
+    @GetMapping("/{id}/edit")
+    public String editForm(@PathVariable Integer id, Model model) {
+        Company c = companyService.findById(id).orElseThrow();
+        Set<CompanyRoleType> selectedRoles = new HashSet<>();
+        if (distributorService.findById(id).isPresent()) selectedRoles.add(CompanyRoleType.DISTRIBUTOR);
+        if (manufacturerService.findById(id).isPresent()) selectedRoles.add(CompanyRoleType.MANUFACTURER);
+        if (pharmacyService.findById(id).isPresent()) selectedRoles.add(CompanyRoleType.PHARMACY);
+        try { if (deliveryCompanyService.findById(id).isPresent()) selectedRoles.add(CompanyRoleType.valueOf("DELIVERYCOMPANY")); }
+        catch (IllegalArgumentException ignored) {}
+
+        model.addAttribute("company", c);
+        model.addAttribute("roleTypes", CompanyRoleType.values());
+        model.addAttribute("selectedRoles", selectedRoles);
+        model.addAttribute("mode", "edit");
+        return "company-form";
+    }
+
+    // POST /companies/{id}/update — simple update + role reset
+    @PostMapping("/{id}/update")
+    public String update(@PathVariable Integer id,
+                         @RequestParam String companyName,
+                         @RequestParam(required = false) String description,
+                         @RequestParam String registrationNumber,
+                         @RequestParam(name = "roles", required = false) List<CompanyRoleType> roles,
+                         RedirectAttributes ra) {
+        // 1) Update core fields (your existing simple update)
+        companyService.update(id, companyName, description, registrationNumber);
+
+        // 2) Reset roles: remove all, then add only the submitted ones
+        distributorService.deleteById(id);
+        manufacturerService.deleteById(id);
+        pharmacyService.deleteById(id);
+        try { deliveryCompanyService.deleteById(id); } catch (Exception ignored) {}
+
+        if (roles != null) {
+            for (CompanyRoleType r : roles) {
+                switch (r) {
+                    case DISTRIBUTOR -> distributorService.create(id);
+                    case MANUFACTURER -> manufacturerService.create(id);
+                    case PHARMACY -> pharmacyService.create(id);
+                    default -> {
+                        if ("DELIVERYCOMPANY".equals(r.name())) {
+                            deliveryCompanyService.create(id);
+                        }
+                    }
+                }
+            }
+        }
+
+        ra.addFlashAttribute("message", "Company updated: " + companyName);
+        return "redirect:/companies";
+    }
+
+
+    // Delete (FKs should cascade from company to roles in DB)
+    @PostMapping("/{id}/delete")
+    public String delete(@PathVariable Integer id, RedirectAttributes ra) {
+        companyService.deleteById(id);
+        ra.addFlashAttribute("message", "Company deleted");
+        return "redirect:/companies";
+    }
+}
Index: src/main/resources/application.properties
===================================================================
--- src/main/resources/application.properties	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/resources/application.properties	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -1,27 +1,26 @@
 spring.application.name=SynergyMed
 
-# src/main/resources/application.properties
+# Database connection
+spring.datasource.url=jdbc:postgresql://localhost:5432/SynergyMed
+spring.datasource.username=postgres
+spring.datasource.password=1234
+spring.jpa.properties.hibernate.default_schema=synergymed
+spring.datasource.driver-class-name=org.postgresql.Driver
+
 security.jwt.secret=REPLACE_WITH_A_RANDOM_32+_CHAR_SECRET_KEY_1234567890abcdef
 security.jwt.exp-min=60
 
-# --- Datasource ---
-spring.datasource.url=jdbc:postgresql://localhost:5432/synergymed
-spring.datasource.username=postgres
-spring.datasource.password=postgres
-# driver is auto-detected but this is fine to add:
-spring.datasource.driver-class-name=org.postgresql.Driver
-
-# Keep RAM low
 spring.datasource.hikari.maximum-pool-size=5
 
-# --- JPA/Hibernate ---
+# JPA / Hibernate settings
 spring.jpa.hibernate.ddl-auto=update
+spring.jpa.show-sql=true
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
-spring.jpa.show-sql=true
-spring.jpa.properties.hibernate.format_sql=true
 
-# Your entities use schema="synergymed"
-spring.jpa.properties.hibernate.default_schema=synergymed
 
-# temporarily disable docker-compose till implemented
+app.upload.branded-medicine-dir=uploads/images/branded_medicine/
+spring.servlet.multipart.max-file-size=5MB
+spring.servlet.multipart.max-request-size=10MB
+
 spring.docker.compose.enabled=false
+
Index: src/main/resources/templates/branded-medicine-form.html
===================================================================
--- src/main/resources/templates/branded-medicine-form.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/resources/templates/branded-medicine-form.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,283 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title th:text="${mode=='create' ? 'Create Branded Medicine' : 'Edit Branded Medicine'}">Form</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <style>
+        :root{--teal-1:#20b2aa;--teal-2:#48d1cc;--bg:#fefeff;--card:#ffffff;--muted:#6c757d;--shadow:0 20px 40px rgba(0,0,0,.1)}
+        *{margin:0;padding:0;box-sizing:border-box}
+        body{font-family:'Segoe UI',Tahoma,Geneva,Verdana,sans-serif;min-height:100vh;display:flex;align-items:flex-start;justify-content:center;background:linear-gradient(135deg,#a4ecba 0%,#fefeff 100%);padding:24px}
+        .wrap{width:100%;max-width:900px;background:#fff;border-radius:20px;overflow:hidden;box-shadow:var(--shadow)}
+        .head{background:linear-gradient(135deg,var(--teal-1),var(--teal-2));color:#fff;padding:26px 24px}
+        .body{padding:26px 24px}
+        .row{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
+        .row-1{display:grid;grid-template-columns:1fr;gap:16px;margin-bottom:6px}
+        label{display:block;margin-bottom:8px;color:#334155;font-weight:600;font-size:.95rem}
+        input,select,textarea{width:100%;padding:14px 12px;border:2px solid #e6ebf0;border-radius:12px;background:#f8fafc;transition:.2s ease;font-size:1rem}
+        textarea{min-height:110px}
+        input:focus,select:focus,textarea:focus{outline:none;border-color:var(--teal-1);background:#fff;box-shadow:0 0 0 3px rgba(32,178,170,.12)}
+        .hint{color:var(--muted);font-size:.86rem;margin-top:4px}
+        .actions{display:flex;gap:12px;padding-top:12px;flex-wrap:wrap}
+        .btn{border:none;padding:12px 16px;border-radius:12px;cursor:pointer;font-weight:700;letter-spacing:.4px}
+        .btn-primary{background:linear-gradient(135deg,var(--teal-1),var(--teal-2));color:#fff;box-shadow:0 10px 20px rgba(32,178,170,.25)}
+        .btn-secondary{background:#fff;color:#111;border:2px solid rgba(32,178,170,.25)}
+        .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:12px}
+        .img-card{position:relative;background:#f8fafc;border:1px solid #e6ebf0;border-radius:12px;padding:8px}
+        .thumb{width:100%;height:110px;object-fit:cover;border-radius:8px;display:block}
+        @media (max-width:720px){.row{grid-template-columns:1fr}}
+    </style>
+</head>
+<body>
+<div th:replace="fragments/header :: siteHeader"></div>
+<div class="wrap">
+    <div class="head">
+        <h2 th:text="${mode=='create' ? 'Create Branded Medicine' : 'Edit Branded Medicine'}">Form</h2>
+    </div>
+
+    <div class="body">
+        <!-- Single SAVE form for both create and edit -->
+        <form th:action="@{/branded-medicines/save}" method="post" enctype="multipart/form-data" id="saveForm">
+            <input type="hidden" name="id" th:if="${mode=='edit'}" th:value="${bm.id}"/>
+
+            <div class="row">
+                <div>
+                    <label>Manufacturer</label>
+                    <select name="manufacturerId" required>
+                        <option th:if="${mode=='create'}" value="" disabled selected>Select manufacturer</option>
+                        <option th:each="m : ${manufacturers}"
+                                th:value="${m.id}"
+                                th:text="${m.company.companyName}"
+                                th:selected="${mode=='edit' and bm.manufacturer != null and m.id == bm.manufacturer.id}">
+                            Manufacturer
+                        </option>
+                    </select>
+                    <div class="hint">Pick the company that manufactured this medicine.</div>
+                </div>
+                <div>
+                    <label>Price</label>
+                    <input type="number" step="0.01" name="price" th:value="${mode=='edit' ? bm.price : ''}" required/>
+                </div>
+            </div>
+
+            <div class="row">
+                <div>
+                    <label>Dosage Form</label>
+                    <input type="text" name="dosageForm" th:value="${mode=='edit' ? bm.dosageForm : ''}" required/>
+                </div>
+                <div>
+                    <label>Strength</label>
+                    <input type="text" name="strength" th:value="${mode=='edit' ? bm.strength : ''}" required/>
+                </div>
+            </div>
+
+            <div class="row">
+                <div>
+                    <label>Origin Country</label>
+                    <input type="text" name="originCountry" th:value="${mode=='edit' ? bm.originCountry : ''}"/>
+                </div>
+                <div>
+                    <label>Name</label>
+                    <input type="text" name="name" th:value="${mode=='edit' ? bm.name : ''}" required/>
+                </div>
+            </div>
+
+            <div class="row-1">
+                <div>
+                    <label>Description</label>
+                    <textarea name="description" th:text="${mode=='edit' ? bm.description : ''}"></textarea>
+                </div>
+                <div>
+                    <label>New Images (preview only until Save)</label>
+                    <input type="file" id="newImages" name="images" multiple accept="image/*"/>
+                    <div class="hint">Choose multiple images to preview; they are saved only when Save is clicked.</div>
+                    <div id="preview" class="grid" style="margin-top:12px;"></div>
+                </div>
+            </div>
+
+            <!-- Existing images (edit mode) -->
+            <div th:if="${mode=='edit' and images != null and !images.isEmpty()}" style="margin-top:18px;">
+                <div class="grid">
+                    <div class="img-card" th:each="img : ${images}">
+                        <img class="thumb" th:src="@{${img.image}}" alt="image">
+                        <input type="hidden" name="removeImageIds" th:value="${img.id}" disabled>
+                        <div style="display:flex;justify-content:space-between;align-items:center;margin-top:6px;">
+                            <button type="button" class="btn-remove-existing"
+                                    th:attr="data-id=${img.id}"
+                                    style="background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:4px 8px;cursor:pointer;">
+                                Remove
+                            </button>
+                            <label style="margin-left:8px;">
+                                <input type="radio" name="mainPick" th:value="${'existing:'+img.id}"
+                                       th:checked="${img.mainImage}">
+                                Main
+                            </label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Hidden fields managed by JS (never "undefined") -->
+            <input type="hidden" id="mainExistingId" name="mainExistingId">
+            <input type="hidden" id="mainNewIndex"   name="mainNewIndex">
+
+            <div class="actions">
+                <button class="btn btn-primary" type="submit">Save</button>
+                <a class="btn btn-secondary" th:href="@{/}">Cancel</a>
+            </div>
+        </form>
+    </div>
+</div>
+
+<script>
+    // Hidden fields for the server (avoid "undefined")
+    const mainExistingId = document.getElementById('mainExistingId');
+    const mainNewIndex   = document.getElementById('mainNewIndex');
+
+    // 1) Existing remove buttons toggle hidden remove ids
+    function wireExistingRemoveButtons() {
+        document.querySelectorAll('.btn-remove-existing').forEach(btn => {
+            btn.addEventListener('click', () => {
+                const card = btn.closest('.img-card');
+                const hidden = card.querySelector('input[type="hidden"][name="removeImageIds"]');
+                const wasEnabled = !hidden.disabled;
+                hidden.disabled = wasEnabled ? true : false;
+                btn.textContent = wasEnabled ? 'Remove' : 'Undo';
+                btn.style.borderColor = wasEnabled ? '#e5e7eb' : '#f0caca';
+                btn.style.color = wasEnabled ? '#111' : '#b3261e';
+
+                // If this was main and now removed, clear main and pick a fallback below
+                const radio = card.querySelector('input[type="radio"][name="mainPick"]');
+                if (!hidden.disabled && radio && radio.checked) {
+                    radio.checked = false;
+                    mainExistingId.value = '';
+                    chooseFallbackMain();
+                }
+            });
+        });
+    }
+    wireExistingRemoveButtons();
+
+    // 2) One radio group across existing and new
+    document.addEventListener('change', (e) => {
+        const t = e.target;
+        if (t && t.name === 'mainPick' && t.type === 'radio') {
+            const v = String(t.value || '');
+            if (v.startsWith('existing:')) {
+                mainExistingId.value = v.split(':')[1] || '';
+                mainNewIndex.value = '';
+            } else if (v.startsWith('new:')) {
+                mainNewIndex.value = v.split(':')[1] || '';
+                mainExistingId.value = '';
+            }
+        }
+    });
+
+    // 3) Aggregate multiple selections with DataTransfer + FileReader previews
+    const fileInput = document.getElementById('newImages');
+    const preview   = document.getElementById('preview');
+    const saveForm  = document.getElementById('saveForm');
+    let aggregated  = [];
+
+    function syncInputFiles() {
+        const dt = new DataTransfer();
+        aggregated.forEach(f => dt.items.add(f));
+        fileInput.files = dt.files;
+    }
+
+    function buildPreviewCard(dataUrl, fileName, idx) {
+        const card = document.createElement('div');
+        card.className = 'img-card';
+        card.innerHTML = `
+    <img class="thumb" src="${dataUrl}" alt="${fileName}">
+    <div style="display:flex;justify-content:space-between;align-items:center;margin-top:6px;">
+      <label>
+        <input type="radio" name="mainPick" value="new:${idx}"> Main (new)
+      </label>
+      <button type="button" class="remove-new-btn" data-index="${idx}"
+              style="background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:4px 8px;cursor:pointer;">
+        Remove
+      </button>
+    </div>
+  `;
+        return card;
+    }
+
+    function renderPreview() {
+        preview.innerHTML = '';
+        aggregated.forEach((file, idx) => {
+            const reader = new FileReader();
+            reader.onload = e => {
+                const card = buildPreviewCard(e.target.result, file.name, idx);
+                preview.appendChild(card);
+                const removeBtn = card.querySelector('.remove-new-btn');
+                removeBtn.addEventListener('click', () => {
+                    const i = parseInt(removeBtn.getAttribute('data-index'), 10);
+                    if (mainNewIndex.value === String(i)) mainNewIndex.value = '';
+                    aggregated.splice(i, 1);
+                    syncInputFiles();
+                    renderPreview();
+                    if (!mainExistingId.value && !mainNewIndex.value) chooseFallbackMain();
+                });
+            };
+            reader.readAsDataURL(file);
+        });
+
+        if (!mainExistingId.value && !mainNewIndex.value && aggregated.length > 0) {
+            mainNewIndex.value = '0';
+            const first = preview.querySelector('input[type="radio"][name="mainPick"][value="new:0"]');
+            if (first) first.checked = true;
+        }
+    }
+
+    function chooseFallbackMain() {
+        const existingCards = document.querySelectorAll('.img-card input[type="hidden"][name="removeImageIds"]');
+        for (const hidden of existingCards) {
+            if (hidden.disabled) {
+                const card = hidden.closest('.img-card');
+                const r = card.querySelector('input[type="radio"][name="mainPick"][value^="existing:"]');
+                if (r) {
+                    r.checked = true;
+                    const v = r.value.split(':')[1] || '';
+                    mainExistingId.value = v;
+                    mainNewIndex.value = '';
+                    return;
+                }
+            }
+        }
+        const newRadio = preview.querySelector('input[type="radio"][name="mainPick"][value^="new:"]');
+        if (newRadio) {
+            newRadio.checked = true;
+            mainExistingId.value = '';
+            mainNewIndex.value = newRadio.value.split(':')[1] || '';
+        } else {
+            mainExistingId.value = '';
+            mainNewIndex.value = '';
+        }
+    }
+
+    fileInput?.addEventListener('change', function () {
+        const files = Array.from(this.files || []);
+        files.forEach(f => { if (/^image\//.test(f.type)) aggregated.push(f); });
+        this.value = ''; // allow re-selecting same file
+        syncInputFiles();
+        renderPreview();
+        if (!mainExistingId.value && !mainNewIndex.value) chooseFallbackMain();
+    });
+
+    (function initMainFromExisting() {
+        const checked = document.querySelector('input[type="radio"][name="mainPick"]:checked');
+        if (checked) {
+            const v = checked.value || '';
+            if (v.startsWith('existing:')) mainExistingId.value = v.split(':')[1] || '';
+            if (v.startsWith('new:'))      mainNewIndex.value   = v.split(':')[1] || '';
+        }
+    })();
+
+    saveForm?.addEventListener('submit', () => {
+        if (mainExistingId.value === 'undefined') mainExistingId.value = '';
+        if (mainNewIndex.value   === 'undefined') mainNewIndex.value   = '';
+    });
+</script>
+</body>
+</html>
Index: src/main/resources/templates/companies.html
===================================================================
--- src/main/resources/templates/companies.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/resources/templates/companies.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>SynergyMed – Companies</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <!-- Header styles -->
+    <th:block th:replace="fragments/header :: headerStyles"></th:block>
+
+    <style>
+        :root{--teal-1:#20b2aa;--teal-2:#48d1cc;--bg:#fefeff;--card:#ffffff;--muted:#6c757d;--text:#1f2937;--shadow:0 20px 40px rgba(0,0,0,0.10);--shadow-sm:0 6px 18px rgba(0,0,0,0.08)}
+        *{margin:0;padding:0;box-sizing:border-box}
+
+        /* Stack header above centered content; remove body padding so header can touch edges */
+        body{
+            font-family:'Segoe UI',Tahoma,Geneva,Verdana,sans-serif;
+            min-height:100vh;
+            background:linear-gradient(135deg,#a4ecba 0%,#fefeff 100%);
+            color:var(--text);
+            display:flex; flex-direction:column; align-items:center;
+        }
+
+        /* Full-width header overrides */
+        .site-header{
+            position: sticky; top:0; left:0; right:0; width:100%;
+            border-radius:0; margin:0; z-index:1000;
+        }
+
+        /* Centered page wrapper now holds the padding */
+        .page{width:100%;max-width:1200px; padding:28px; margin:0 auto}
+
+        .header{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;background:linear-gradient(135deg,var(--teal-1),var(--teal-2));color:#fff;padding:20px 24px;border-radius:20px;box-shadow:var(--shadow)}
+        .btn{display:inline-block;border:none;cursor:pointer;text-decoration:none;padding:12px 16px;border-radius:12px;font-weight:600;letter-spacing:.5px;transition:.2s ease}
+        .btn-primary{background:linear-gradient(135deg,var(--teal-1),var(--teal-2));color:#fff;box-shadow:0 10px 20px rgba(32,178,170,.25)}
+        .btn-primary:hover{transform:translateY(-2px)}
+        .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:22px}
+        .card{background:var(--card);border-radius:18px;overflow:hidden;box-shadow:var(--shadow-sm);display:flex;flex-direction:column}
+        .content{padding:14px 16px 18px}
+        .title{font-weight:700;margin:6px 0 2px}
+        .muted{color:var(--muted);font-size:.92rem}
+        .row{display:flex;justify-content:space-between;align-items:center;margin-top:10px}
+        .badge{display:inline-block;background:rgba(32,178,170,.12);color:#137a74;padding:4px 8px;border-radius:999px;font-size:.80rem;font-weight:700;margin-right:6px}
+        .btn-outline{background:#fff;border:2px solid rgba(32,178,170,.25);color:#20b2aa;padding:8px 12px;border-radius:10px;text-decoration:none;font-weight:600;transition:.2s ease}
+        .btn-outline:hover{border-color:#20b2aa;box-shadow:0 6px 14px rgba(32,178,170,.18)}
+        @media (max-width:560px){.page{padding:16px}.header{padding:16px}}
+    </style>
+</head>
+<body>
+
+<!-- Full-width global header OUTSIDE the .page container -->
+<th:block th:replace="fragments/header :: siteHeader('companies', ${username})"></th:block>
+
+<div class="page">
+    <div class="header">
+        <h2>Companies</h2>
+        <a class="btn btn-primary" th:href="@{/companies/new}">Create</a>
+    </div>
+
+    <div class="grid">
+        <div class="card" th:each="c : ${companies}">
+            <div class="content">
+                <div class="title" th:text="${c.companyName}">Company Name</div>
+                <div class="muted" th:text="${'Reg. No: ' + c.registrationNumber}">Reg No</div>
+                <div class="muted" th:text="${c.description}">Description</div>
+
+                <div style="margin-top:8px;">
+                    <span class="badge" th:each="r : ${rolesByCompany[c.id]}" th:text="${r}">ROLE</span>
+                </div>
+
+                <div class="row" style="margin-top:12px;">
+                    <div>
+                        <a class="btn-outline" th:href="@{/companies/{id}/edit(id=${c.id})}" style="margin-right:8px;">Edit</a>
+                    </div>
+                    <form th:action="@{/companies/{id}/delete(id=${c.id})}" method="post" style="display:inline">
+                        <button type="submit" class="btn-outline" style="color:#b3261e;border-color:#f0caca">Delete</button>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Header dropdown script -->
+<th:block th:replace="fragments/header :: headerScripts"></th:block>
+</body>
+</html>
Index: src/main/resources/templates/company-form.html
===================================================================
--- src/main/resources/templates/company-form.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/resources/templates/company-form.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title th:text="${mode=='create' ? 'Create Company' : 'Edit Company'}">Company</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <style>
+        :root{--teal-1:#20b2aa;--teal-2:#48d1cc;--bg:#fefeff;--card:#ffffff;--muted:#6c757d;--shadow:0 20px 40px rgba(0,0,0,.1)}
+        *{margin:0;padding:0;box-sizing:border-box}
+        body{font-family:'Segoe UI',Tahoma,Geneva,Verdana,sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#a4ecba 0%,#fefeff 100%);padding:24px}
+        .wrap{width:100%;max-width:720px;background:#fff;border-radius:20px;overflow:hidden;box-shadow:var(--shadow)}
+        .head{background:linear-gradient(135deg,var(--teal-1),var(--teal-2));color:#fff;padding:26px 24px}
+        .body{padding:26px 24px}
+        .row{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
+        .row-1{display:grid;grid-template-columns:1fr;gap:16px;margin-bottom:6px}
+        label{display:block;margin-bottom:8px;color:#334155;font-weight:600;font-size:.95rem}
+        input,textarea{width:100%;padding:14px 12px;border:2px solid #e6ebf0;border-radius:12px;background:#f8fafc;transition:.2s ease;font-size:1rem}
+        textarea{min-height:110px}
+        input:focus,textarea:focus{outline:none;border-color:var(--teal-1);background:#fff;box-shadow:0 0 0 3px rgba(32,178,170,.12)}
+        .hint{color:var(--muted);font-size:.86rem;margin-top:4px}
+        .roles{display:flex;flex-wrap:wrap;gap:10px;margin-top:6px}
+        .chip{display:inline-flex;align-items:center;gap:6px;border:2px solid rgba(32,178,170,.25);border-radius:999px;padding:8px 12px;background:#fff}
+        .actions{display:flex;gap:12px;padding:0 24px 24px 24px}
+        .btn{border:none;padding:12px 16px;border-radius:12px;cursor:pointer;font-weight:700;letter-spacing:.4px}
+        .btn-primary{background:linear-gradient(135deg,var(--teal-1),var(--teal-2));color:#fff;box-shadow:0 10px 20px rgba(32,178,170,.25)}
+        .btn-secondary{background:#fff;color:#111;border:2px solid rgba(32,178,170,.25)}
+    </style>
+</head>
+<body>
+<div class="wrap">
+    <div class="head">
+        <h2 th:text="${mode=='create' ? 'Create Company' : 'Edit Company'}">Company</h2>
+    </div>
+
+    <div class="body">
+        <form th:action="${mode=='create'} ? @{/companies} : @{/companies/{id}/update(id=${company.id})}" method="post">
+            <!-- If Spring Security is enabled, include a CSRF token input here -->
+
+            <div class="row">
+                <div>
+                    <label>Company Name</label>
+                    <input type="text" name="companyName" th:value="${mode=='edit' ? company.companyName : ''}" required>
+                </div>
+                <div>
+                    <label>Registration Number</label>
+                    <input type="text" name="registrationNumber" th:value="${mode=='edit' ? company.registrationNumber : ''}" required>
+                </div>
+            </div>
+
+            <div class="row-1">
+                <div>
+                    <label>Description</label>
+                    <textarea name="description" th:text="${mode=='edit' ? company.description : ''}"></textarea>
+                </div>
+            </div>
+
+            <!-- Roles on both create and edit; edit pre-checks via selectedRoles -->
+            <div class="row-1">
+                <div>
+                    <label>Company Types</label>
+                    <div class="roles">
+                        <label class="chip" th:each="rt : ${roleTypes}">
+                            <input type="checkbox" name="roles" th:value="${rt}"
+                                   th:checked="${mode=='edit' and selectedRoles != null and selectedRoles.contains(rt)}">
+                            <span th:text="${rt}">ROLE</span>
+                        </label>
+                    </div>
+                    <div class="hint">Select roles; on update, existing roles are pre-checked based on current state.</div>
+                </div>
+            </div>
+
+            <div class="actions">
+                <button class="btn btn-primary" type="submit" th:text="${mode=='create' ? 'Create' : 'Update'}">Save</button>
+                <a class="btn btn-secondary" th:href="@{/companies}">Cancel</a>
+            </div>
+        </form>
+    </div>
+</div>
+</body>
+</html>
Index: src/main/resources/templates/fragments/header.html
===================================================================
--- src/main/resources/templates/fragments/header.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/resources/templates/fragments/header.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,188 @@
+<!-- templates/fragments/header.html -->
+
+<!-- Head styles fragment -->
+<th:block th:fragment="headerStyles">
+    <style>
+        :root{
+            /* Light neutral palette */
+            --teal-1:#ffffff;      /* white */
+            --teal-2:#ece8df;      /* soft beige-gray */
+            --text:#1f2937;        /* dark gray text */
+            --muted:#4b5563;       /* medium gray text */
+            --shadow:0 20px 40px rgba(0,0,0,0.10);
+            --shadow-sm:0 6px 18px rgba(0,0,0,0.08);
+        }
+
+        /* Header container */
+        .site-header{
+            position: sticky; top: 20px; z-index: 50;
+            display:flex; align-items:center; justify-content:space-between; gap:16px;
+            padding:14px 18px;
+            background: linear-gradient(135deg, var(--teal-1), var(--teal-2)); /* white → beige-gray */
+            color: var(--text);                         /* darker text for contrast */
+            border-radius:20px; box-shadow: var(--shadow);
+        }
+
+        /* Brand/logo */
+        .brand{display:flex; align-items:center; gap:12px; text-decoration:none; color:inherit}
+        .logo{height:36px; width:auto; display:block; border-radius:10px}
+        .brand-name{font-weight:700; letter-spacing:.3px}
+
+        /* Primary nav */
+        .main-nav{display:flex; gap:10px; align-items:center}
+        .nav-btn{
+            display:inline-flex; align-items:center; gap:8px;
+            padding:10px 14px; border-radius:12px;
+            color:#111827;                                  /* dark text */
+            text-decoration:none; font-weight:600;
+            background: rgba(0,0,0,.06);                    /* subtle neutral chip */
+            border:1px solid rgba(0,0,0,.10);
+            transition: transform .15s ease, background .15s ease, box-shadow .15s ease, border-color .15s ease;
+        }
+        .nav-btn:hover{
+            transform: translateY(-1px);
+            background: rgba(0,0,0,.10);
+            border-color: rgba(0,0,0,.14);
+        }
+        .nav-btn.active{
+            box-shadow: 0 8px 18px rgba(0,0,0,.10);
+            background: rgba(0,0,0,.12);
+            border-color: rgba(0,0,0,.16);
+        }
+
+        /* Account area */
+        .account{margin-left:auto; display:flex; align-items:center}
+
+        /* Neutral login button to match light header */
+        .login-btn{
+            display:inline-flex; align-items:center; padding:10px 14px; border-radius:12px;
+            color:#111827; background:#ffffff;
+            text-decoration:none; font-weight:700;
+            border:1px solid rgba(0,0,0,.14);
+            box-shadow: 0 1px 2px rgba(0,0,0,.04);
+            transition:.15s ease;
+        }
+        .login-btn:hover{
+            border-color: rgba(0,0,0,.22);
+            background:#f3f4f6;
+            box-shadow: 0 6px 14px rgba(0,0,0,.10);
+        }
+
+        /* User menu button + dropdown */
+        .user-menu{position:relative}
+        .user-button{
+            display:flex; align-items:center; gap:8px;
+            padding:8px 10px; border-radius:14px; cursor:pointer;
+            background: rgba(0,0,0,.06);
+            border:1px solid rgba(0,0,0,.10);
+            color:#111827; font-weight:600;
+            transition: .15s ease;
+        }
+        .user-button:hover{
+            background: rgba(0,0,0,.10);
+            border-color: rgba(0,0,0,.14);
+        }
+        .user-button:focus-visible{outline:3px solid rgba(0,0,0,.25); outline-offset:2px}
+
+        .avatar{
+            width:28px; height:28px; border-radius:50%;
+            display:grid; place-items:center; font-weight:800; font-size:.9rem;
+            background:#e5e7eb; color:#111827;                 /* light chip, dark letter */
+        }
+        .user-name{max-width:160px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis}
+        .chev{opacity:.85}
+
+        .dropdown{
+            position:absolute; right:0; top: calc(100% + 10px); min-width:220px;
+            background:#ffffff; color: var(--text); border-radius:14px; box-shadow: var(--shadow-sm);
+            padding:8px; pointer-events:none; opacity:0; transform: translateY(-6px);
+            transition: opacity .12s ease, transform .12s ease;
+            border:1px solid rgba(0,0,0,.06);
+        }
+        .user-menu.open .dropdown{pointer-events:auto; opacity:1; transform: translateY(0)}
+        .dropdown-item{
+            display:flex; align-items:center; justify-content:space-between;
+            width:100%; text-decoration:none; background:transparent; border:none; cursor:pointer;
+            color: var(--text); padding:10px 12px; border-radius:10px; font-weight:600;
+        }
+        .dropdown-item:hover{background:#f3f4f6}
+        .dropdown-item.danger{color:#b3261e}
+        .dropdown-item.danger:hover{background:#fdecec}
+
+        /* Responsive tweaks */
+        @media (max-width: 780px){
+            .site-header{flex-wrap:wrap; row-gap:10px}
+            .main-nav{order:3; width:100%; justify-content:center}
+            .account{margin-left:0; margin-right:0}
+            .user-name{display:none}
+        }
+    </style>
+</th:block>
+
+<!-- Body header fragment (parameterized) -->
+<th:block th:fragment="siteHeader(activePage, username)">
+    <header class="site-header">
+        <a class="brand" th:href="@{/}">
+            <img src="/logo.png" alt="SynergyMed logo" class="logo">
+        </a>
+
+        <nav class="main-nav" aria-label="Primary">
+            <a class="nav-btn" th:href="@{/branded-medicines}"
+               th:classappend="${activePage}=='medicines' ? ' active'">Medicine</a>
+            <a class="nav-btn" th:href="@{/companies}"
+               th:classappend="${activePage}=='companies' ? ' active'">Companies</a>
+        </nav>
+
+        <div class="account">
+            <div class="user-menu" th:if="${username}">
+                <button class="user-button" id="userButton" type="button"
+                        aria-haspopup="true" aria-expanded="false" aria-controls="userDropdown">
+                    <span class="avatar" th:text="${#strings.substring(username,0,1).toUpperCase()}">U</span>
+                    <span class="user-name" th:text="${username}">username</span>
+                    <svg class="chev" width="14" height="14" viewBox="0 0 24 24" aria-hidden="true">
+                        <path fill="currentColor" d="M7 10l5 5 5-5z"/>
+                    </svg>
+                </button>
+                <div class="dropdown" id="userDropdown" role="menu" aria-labelledby="userButton">
+                    <a class="dropdown-item" th:href="@{/profile}" role="menuitem">Profile settings</a>
+                    <form th:action="@{/logout}" method="post" style="margin:0">
+                        <input type="hidden" th:name="${_csrf?.parameterName}" th:value="${_csrf?.token}">
+                        <button type="submit" class="dropdown-item danger" role="menuitem">Logout</button>
+                    </form>
+                </div>
+            </div>
+
+            <a class="login-btn" th:unless="${username}" th:href="@{/login}">Log in</a>
+        </div>
+    </header>
+</th:block>
+
+<!-- Footer scripts fragment -->
+<th:block th:fragment="headerScripts">
+    <script>
+        (function(){
+            const menu = document.querySelector('.user-menu');
+            if(!menu) return;
+            const btn = menu.querySelector('#userButton');
+
+            function closeMenu(){
+                menu.classList.remove('open');
+                btn && btn.setAttribute('aria-expanded','false');
+            }
+            function openMenu(){
+                menu.classList.add('open');
+                btn && btn.setAttribute('aria-expanded','true');
+            }
+            btn && btn.addEventListener('click', (e)=>{
+                e.stopPropagation();
+                menu.classList.contains('open') ? closeMenu() : openMenu();
+            });
+            document.addEventListener('click', (e)=>{
+                if(!menu.contains(e.target)) closeMenu();
+            });
+            document.addEventListener('keydown', (e)=>{
+                if(e.key === 'Escape') closeMenu();
+            });
+        })();
+    </script>
+</th:block>
Index: src/main/resources/templates/index.html
===================================================================
--- src/main/resources/templates/index.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
+++ src/main/resources/templates/index.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>SynergyMed – Branded Medicines</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <!-- Header styles (fragment from templates/fragments/header.html) -->
+    <th:block th:replace="fragments/header :: headerStyles"></th:block>
+
+    <!-- Page styles -->
+    <style>
+        :root{
+            --teal-1:#20b2aa; --teal-2:#48d1cc; --bg:#fefeff; --card:#ffffff;
+            --muted:#6c757d; --text:#1f2937;
+            --shadow:0 20px 40px rgba(0,0,0,0.10);
+            --shadow-sm:0 6px 18px rgba(0,0,0,0.08);
+        }
+        *{margin:0;padding:0;box-sizing:border-box}
+
+        /* Make the header edge-to-edge at the very top, and stack content under it */
+        body{
+            font-family:'Segoe UI',Tahoma,Geneva,Verdana,sans-serif;
+            min-height:100vh;
+            background:linear-gradient(135deg,#a4ecba 0%,#fefeff 100%);
+            color:var(--text);
+            display:flex;
+            flex-direction:column;   /* stack header and page vertically */
+            align-items:center;      /* center the .page container */
+            /* no body padding so header touches the edges */
+        }
+
+        /* Centered content container with interior padding (replacing old body padding) */
+        .page{
+            width:100%;
+            max-width:1200px;
+            padding:28px;           /* replaces previous body padding */
+            margin:0 auto;
+        }
+
+        /* Force the global site header to be full-width, square corners, top-attached */
+        .site-header{
+            position: sticky;       /* stays attached while scrolling */
+            top:0;
+            left:0;
+            right:0;
+            width:100%;
+            border-radius:0;        /* remove rounded corners */
+            margin:0;               /* no outer gap */
+            z-index:1000;           /* keep above content */
+        }
+
+        /* Optional: space between global header and the page section header */
+        .after-site-header{ height: 16px; }
+
+        /* Page section header (title + create button) */
+        .header{
+            display:flex;justify-content:space-between;align-items:center;
+            margin-bottom:24px;
+            background:linear-gradient(135deg,var(--teal-1),var(--teal-2));
+            color:#fff;padding:20px 24px;border-radius:20px;box-shadow:var(--shadow);
+        }
+
+        .btn{display:inline-block;border:none;cursor:pointer;text-decoration:none;
+            padding:12px 16px;border-radius:12px;font-weight:600;letter-spacing:.5px;transition:.2s ease}
+        .btn-primary{background:linear-gradient(135deg,var(--teal-1),var(--teal-2));color:#fff;box-shadow:0 10px 20px rgba(32,178,170,.25)}
+        .btn-primary:hover{transform:translateY(-2px)}
+
+        .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:22px}
+        .card{background:var(--card);border-radius:18px;overflow:hidden;box-shadow:var(--shadow-sm);display:flex;flex-direction:column}
+        .thumb{width:100%;height:240px;object-fit:cover;background:#eef2f3;display:block}
+        .content{padding:14px 16px 18px}
+        .title{font-weight:700;margin:6px 0 2px}
+        .muted{color:var(--muted);font-size:.92rem}
+        .row{display:flex;justify-content:space-between;align-items:center;margin-top:10px}
+        .price{font-weight:800}
+        .btn-outline{background:#fff;border:2px solid rgba(32,178,170,.25);color:#20b2aa;padding:8px 12px;border-radius:10px;text-decoration:none;font-weight:600;transition:.2s ease}
+        .btn-outline:hover{border-color:#20b2aa;box-shadow:0 6px 14px rgba(32,178,170,.18)}
+
+        @media (max-width:560px){
+            .page{padding:16px}
+            .header{padding:16px}
+        }
+    </style>
+</head>
+<body>
+
+<!-- Full-width, top-attached global header -->
+<th:block th:replace="fragments/header :: siteHeader('medicines', ${username})"></th:block>
+
+<!-- small spacer below the global header (optional) -->
+<div class="after-site-header" aria-hidden="true"></div>
+
+<!-- Centered page content -->
+<div class="page">
+    <div class="header">
+        <h2>Branded Medicines</h2>
+        <a class="btn btn-primary" th:href="@{/branded-medicines/new}">Create</a>
+    </div>
+
+    <div class="grid">
+        <div class="card" th:each="bm : ${medicines}">
+            <img class="thumb" th:src="@{${firstImageById[bm.id]}}" alt="product image">
+            <div class="content">
+                <div class="title" th:text="${bm.name}">Name</div>
+                <div class="muted" th:text="${bm.dosageForm}">Dosage Form</div>
+                <div class="row">
+                    <div class="price" th:text="${'$' + #numbers.formatDecimal(bm.price, 1, 'COMMA', 2, 'POINT')}">$0.00</div>
+                    <div>
+                        <form th:action="@{/branded-medicines/{id}/delete(id=${bm.id})}" method="post" style="display:inline">
+                            <button type="submit" class="btn-outline" style="margin-right:8px;color:#b3261e;border-color:#f0caca">Delete</button>
+                        </form>
+                        <a class="btn-outline" th:href="@{/branded-medicines/{id}/edit(id=${bm.id})}">Edit</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- Header dropdown script -->
+<th:block th:replace="fragments/header :: headerScripts"></th:block>
+</body>
+</html>
Index: src/main/resources/templates/profile.html
===================================================================
--- src/main/resources/templates/profile.html	(revision fa9c17a3dab93ba9cd525f7deb850d6af995b3fb)
+++ src/main/resources/templates/profile.html	(revision 7be83a29a6442ece1edbd4cee2f6ffadb39e8a3c)
@@ -5,21 +5,33 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>SynergyMed - Profile</title>
+
+    <!-- Shared header styles -->
+    <th:block th:replace="fragments/header :: headerStyles"></th:block>
+
     <style>
-        * {
-            margin: 0;
-            padding: 0;
-            box-sizing: border-box;
-        }
-
+        * { margin: 0; padding: 0; box-sizing: border-box; }
+
+        /* Stack header above centered content; remove body padding so header can touch edges */
         body {
             font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
             background: linear-gradient(135deg, #a4ecba 0%, #f7f7f8 100%);
             min-height: 100vh;
-            padding: 20px;
-        }
-
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            /* no body padding so the full-width header reaches the edges */
+        }
+
+        /* Make the global header full-width, square corners, and stick to the very top */
+        .site-header {
+            position: sticky; top: 0; left: 0; right: 0; width: 100%;
+            border-radius: 0; margin: 0; z-index: 1000;
+        }
+
+        /* Centered page container now holds the side padding */
         .container {
             max-width: 1200px;
             margin: 0 auto;
+            padding: 20px; /* moved from body */
         }
 
@@ -45,6 +57,5 @@
             height: 120px;
             border-radius: 50%;
-            /* TODO: Replace with actual profile picture */
-            background: #888;
+            background: #888; /* TODO: Replace with actual profile picture */
             display: flex;
             align-items: center;
@@ -131,12 +142,7 @@
         }
 
-        .card-body {
-            padding: 30px;
-        }
-
-        .info-grid {
-            display: grid;
-            gap: 20px;
-        }
+        .card-body { padding: 30px; }
+
+        .info-grid { display: grid; gap: 20px; }
 
         .info-item {
@@ -148,18 +154,8 @@
         }
 
-        .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;
-        }
+        .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 {
@@ -187,9 +183,5 @@
         }
 
-        .medicine-name {
-            font-weight: 600;
-            color: #333;
-            font-size: 1.1rem;
-        }
+        .medicine-name { font-weight: 600; color: #333; font-size: 1.1rem; }
 
         .severity {
@@ -200,31 +192,10 @@
             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;
-        }
+        .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 {
@@ -233,10 +204,5 @@
             color: #888;
         }
-
-        .no-data-icon {
-            font-size: 4rem;
-            margin-bottom: 20px;
-            opacity: 0.3;
-        }
+        .no-data-icon { font-size: 4rem; margin-bottom: 20px; opacity: 0.3; }
 
         .logout-btn {
@@ -250,5 +216,4 @@
             font-weight: 500;
         }
-
         .logout-btn:hover {
             transform: translateY(-2px);
@@ -257,37 +222,19 @@
 
         @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;
-            }
+            .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>
+
+<!-- Full-width global header OUTSIDE the container -->
+<!-- Pass null as activePage so no nav item is highlighted on the Profile page -->
+<th:block th:replace="fragments/header :: siteHeader(${null}, ${username})"></th:block>
+
 <div class="container">
     <!-- Profile Header -->
@@ -334,7 +281,5 @@
         <!-- Personal Information Card -->
         <div class="card">
-            <div class="card-header">
-                Personal Information
-            </div>
+            <div class="card-header">Personal Information</div>
             <div class="card-body">
                 <div class="info-grid">
@@ -369,7 +314,5 @@
         <!-- Health Profile Card -->
         <div class="card">
-            <div class="card-header">
-                Health Profile
-            </div>
+            <div class="card-header">Health Profile</div>
             <div class="card-body">
                 <div th:if="${hasHealthProfile}">
@@ -416,4 +359,7 @@
     </div>
 </div>
+
+<!-- Shared header dropdown script -->
+<th:block th:replace="fragments/header :: headerScripts"></th:block>
 </body>
 </html>
