Index: pom.xml
===================================================================
--- pom.xml	(revision c87db71f06a0fe440ecc644244f411921061afd0)
+++ pom.xml	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -58,10 +58,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>
@@ -71,5 +65,6 @@
 			<groupId>org.projectlombok</groupId>
 			<artifactId>lombok</artifactId>
-			<optional>true</optional>
+			<version>1.18.32</version>
+			<scope>provided</scope>
 		</dependency>
 		<dependency>
@@ -95,4 +90,5 @@
 							<groupId>org.projectlombok</groupId>
 							<artifactId>lombok</artifactId>
+							<version>1.18.32</version>
 						</path>
 					</annotationProcessorPaths>
Index: src/main/java/mk/ukim/finki/synergymed/config/SecurityConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/config/SecurityConfig.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/config/SecurityConfig.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -0,0 +1,20 @@
+package mk.ukim.finki.synergymed.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.SecurityFilterChain;
+
+@Configuration
+public class SecurityConfig {
+
+    @Bean
+    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+        http
+                .authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
+                .csrf(csrf -> csrf.disable())   // disable CSRF if not needed
+                .formLogin(form -> form.disable()) // disable form login
+                .httpBasic(basic -> basic.disable()); // disable basic auth
+        return http.build();
+    }
+}
Index: src/main/java/mk/ukim/finki/synergymed/config/StaticResourceConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/config/StaticResourceConfig.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/config/StaticResourceConfig.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/java/mk/ukim/finki/synergymed/models/Brandedmedicineimage.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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/Distributor.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/models/Distributor.java	(revision c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/java/mk/ukim/finki/synergymed/models/Distributor.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/java/mk/ukim/finki/synergymed/models/Manufacturer.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/java/mk/ukim/finki/synergymed/models/Pharmacy.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/models/enumerations/CompanyRoleType.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.synergymed.models.enumerations;
+
+
+public enum CompanyRoleType {
+    DISTRIBUTOR,
+    MANUFACTURER,
+    PHARMACY
+}
Index: src/main/java/mk/ukim/finki/synergymed/repositories/BrandedmedicineimageRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/repositories/BrandedmedicineimageRepository.java	(revision c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/java/mk/ukim/finki/synergymed/repositories/BrandedmedicineimageRepository.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/java/mk/ukim/finki/synergymed/service/BrandedMedicineService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -1,5 +1,47 @@
 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);
 
+    Brandedmedicine create(Integer manufacturerId,
+                           BigDecimal price,
+                           String description,
+                           String dosageForm,
+                           String strength,
+                           String originCountry,
+                           String name,
+                           MultipartFile[] images) throws IOException;
+
+    Brandedmedicine update(Integer id,
+                           Integer manufacturerId,
+                           BigDecimal price,
+                           String description,
+                           String dosageForm,
+                           String strength,
+                           String originCountry,
+                           String name,
+                           MultipartFile[] images,
+                           boolean replaceImagesIgnored) throws IOException;
+
+    void addImages(Integer brandedMedicineId, MultipartFile[] images) throws IOException;
+    void deleteImage(Integer imageId) throws IOException;
+    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 setMainImage(Integer brandedMedicineId, Integer imageId);
 }
Index: src/main/java/mk/ukim/finki/synergymed/service/CompanyOrchestrationService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/CompanyOrchestrationService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/CompanyOrchestrationService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/CompanyService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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/DistributorService.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/DistributorService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/DistributorService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/ManufacturerService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/java/mk/ukim/finki/synergymed/service/MedicineService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -8,8 +8,14 @@
 import java.io.IOException;
 import java.util.List;
+import java.util.Optional;
 
 public interface MedicineService {
+    Optional<Medicine> findById(Integer id);
 
-    List<Medicine> findAllMedicine();
-    Medicine save(String medicineName,String activeIngredients) throws IOException;
+    List<Medicine> findAll();
+    Medicine save(String medicineName,String activeIngredients);
+
+    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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/PharmacyService.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/BrandedMedicineServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -0,0 +1,243 @@
+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; // write to ./uploads/images/branded_medicine/
+
+    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
+    @Transactional
+    public Brandedmedicine create(Integer manufacturerId, BigDecimal price, String description,
+                                  String dosageForm, String strength, String originCountry,
+                                  String name, MultipartFile[] images) throws IOException {
+        Manufacturer m = manufacturerRepository.findById(manufacturerId)
+                .orElseThrow(() -> new EntityNotFoundException("Manufacturer not found: " + manufacturerId));
+        Brandedmedicine bm = new Brandedmedicine();
+        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 (images != null && images.length > 0) {
+            processImageUploads(images, saved);
+        }
+        return saved;
+    }
+
+    @Override
+    @Transactional
+    public Brandedmedicine update(Integer id, Integer manufacturerId, BigDecimal price, String description,
+                                  String dosageForm, String strength, String originCountry,
+                                  String name, MultipartFile[] images,
+                                  boolean replaceImagesIgnored) throws IOException {
+        Brandedmedicine bm = brandedMedicineRepository.findById(id)
+                .orElseThrow(() -> new EntityNotFoundException("Branded medicine not found: " + id));
+
+        if (manufacturerId != null) {
+            Manufacturer m = manufacturerRepository.findById(manufacturerId)
+                    .orElseThrow(() -> new EntityNotFoundException("Manufacturer not found: " + manufacturerId));
+            bm.setManufacturer(m);
+        }
+        if (price != null) bm.setPrice(price);
+        bm.setDescription(description);
+        bm.setDosageForm(dosageForm);
+        bm.setStrength(strength);
+        bm.setOriginCountry(originCountry);
+        bm.setName(name);
+
+        Brandedmedicine saved = brandedMedicineRepository.save(bm);
+        if (images != null && images.length > 0) {
+            processImageUploads(images, saved); // append only
+        }
+        return saved;
+    }
+
+    @Override
+    @Transactional
+    public void addImages(Integer brandedMedicineId, MultipartFile[] images) throws IOException {
+        if (images == null || images.length == 0) return;
+        Brandedmedicine bm = brandedMedicineRepository.findById(brandedMedicineId)
+                .orElseThrow(() -> new EntityNotFoundException("Branded medicine not found: " + brandedMedicineId));
+        processImageUploads(images, bm);
+    }
+
+    @Override
+    @Transactional
+    public void deleteImage(Integer imageId) throws IOException {
+        Brandedmedicineimage img = brandedMedicineImageRepository.findById(imageId)
+                .orElseThrow(() -> new EntityNotFoundException("Branded medicine image not found: " + imageId));
+
+        Integer bmId = img.getBrandedMedicine().getId();
+        boolean wasMain = img.isMainImage();
+
+        deletePhysicalFileIfExists(img.getImage());
+        brandedMedicineImageRepository.deleteById(imageId);
+
+        if (wasMain) {
+            brandedMedicineImageRepository.findFirstByBrandedMedicineIdOrderByIdAsc(bmId)
+                    .ifPresent(next -> {
+                        next.setMainImage(true);
+                        brandedMedicineImageRepository.save(next);
+                    });
+        }
+    }
+
+    @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);
+    }
+
+    // New: list images for edit page
+    @Override
+    public List<Brandedmedicineimage> listImages(Integer brandedMedicineId) {
+        return brandedMedicineImageRepository.findByBrandedMedicineIdOrderByIdAsc(brandedMedicineId);
+    }
+
+    // New: resolve card image URL (main or fallback, else placeholder)
+    @Override
+    public String cardImageUrl(Integer brandedMedicineId) {
+        return brandedMedicineImageRepository.findFirstByBrandedMedicineIdAndMainImageTrue(brandedMedicineId)
+                .map(Brandedmedicineimage::getImage)
+                .orElseGet(() -> brandedMedicineImageRepository
+                        .findFirstByBrandedMedicineIdOrderByIdAsc(brandedMedicineId)
+                        .map(Brandedmedicineimage::getImage)
+                        .orElse("/images/placeholder.png"));
+    }
+
+    // New: convenience map for list pages
+    @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 setMainImage(Integer brandedMedicineId, Integer imageId) {
+        Brandedmedicineimage chosen = brandedMedicineImageRepository.findById(imageId)
+                .orElseThrow(() -> new EntityNotFoundException("Image not found: " + imageId));
+        if (!Objects.equals(chosen.getBrandedMedicine().getId(), brandedMedicineId)) {
+            throw new IllegalArgumentException("Image does not belong to this Brandedmedicine");
+        }
+        List<Brandedmedicineimage> all = brandedMedicineImageRepository.findByBrandedMedicineId(brandedMedicineId);
+        for (Brandedmedicineimage img : all) {
+            boolean shouldBeMain = Objects.equals(img.getId(), imageId);
+            if (img.isMainImage() != shouldBeMain) {
+                img.setMainImage(shouldBeMain);
+                brandedMedicineImageRepository.save(img);
+            }
+        }
+    }
+
+    // ---------- helpers ----------
+
+    private void processImageUploads(MultipartFile[] images, Brandedmedicine bm) throws IOException {
+        Path base = ensureUploadPath();
+        long ts = System.currentTimeMillis();
+        int i = 0;
+
+        boolean hasMain = brandedMedicineImageRepository.existsByBrandedMedicineIdAndMainImageTrue(bm.getId());
+
+        for (MultipartFile file : images) {
+            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", bm.getId(), ts, ++i, 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(bm);
+            img.setImage(url);
+            img.setMainImage(!hasMain && i == 1); // first image if no main yet
+            brandedMedicineImageRepository.save(img);
+        }
+    }
+
+    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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyOrchestrationServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/CompanyServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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/DistributorServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/synergymed/service/impl/DistributorServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/DistributorServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/ManufacturerServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/MedicineServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -0,0 +1,56 @@
+package mk.ukim.finki.synergymed.service.impl;
+
+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;
+
+@Service
+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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/service/impl/PharmacyServiceImpl.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -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 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/java/mk/ukim/finki/synergymed/web/BrandedMedicineController.java	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -0,0 +1,116 @@
+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.*;
+
+@Controller
+@RequestMapping("/")
+public class BrandedMedicineController {
+
+    private final BrandedMedicineService brandedMedicineService;
+    private final ManufacturerService manufacturerService;
+
+    public BrandedMedicineController(BrandedMedicineService brandedMedicineService,
+                                     ManufacturerService manufacturerService) {
+        this.brandedMedicineService = brandedMedicineService;
+        this.manufacturerService = manufacturerService;
+    }
+
+    // Home – list all branded medicines
+    @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";
+    }
+
+    // Create form
+    @GetMapping("/branded-medicines/new")
+    public String createForm(Model model) {
+        model.addAttribute("manufacturers", manufacturerService.findAll());
+        model.addAttribute("mode", "create");
+        return "branded-medicine-form";
+    }
+
+    // Create: saves fields, appends any images, then goes home
+    @PostMapping("/branded-medicines")
+    public String create(@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) throws IOException {
+
+        brandedMedicineService.create(
+                manufacturerId, price, description, dosageForm, strength, originCountry, name, images
+        );
+        return "redirect:/";
+    }
+
+    // Edit form (still available if needed)
+    @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";
+    }
+
+    // Update: saves fields, appends any images, then goes home
+    @PostMapping("/branded-medicines/{id}/update")
+    public String update(@PathVariable 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) throws IOException {
+
+        // Service update already appends images if provided
+        brandedMedicineService.update(
+                id, manufacturerId, price, description, dosageForm, strength, originCountry, name, images, false
+        );
+        return "redirect:/";
+    }
+
+    // Delete branded medicine (+ all images)
+    @PostMapping("/branded-medicines/{id}/delete")
+    public String deleteBrandedMedicine(@PathVariable Integer id) throws IOException {
+        brandedMedicineService.deleteById(id);
+        return "redirect:/";
+    }
+
+    // Per-image actions (optional to keep; still useful if visiting the edit page)
+    @PostMapping("/branded-medicines/{bmId}/images/{imageId}/delete")
+    public String deleteImage(@PathVariable Integer bmId, @PathVariable Integer imageId) throws IOException {
+        brandedMedicineService.deleteImage(imageId);
+        return "redirect:/branded-medicines/" + bmId + "/edit";
+    }
+
+    @PostMapping("/branded-medicines/{bmId}/images/{imageId}/set-main")
+    public String setMain(@PathVariable Integer bmId, @PathVariable Integer imageId) {
+        brandedMedicineService.setMainImage(bmId, imageId);
+        return "redirect:/branded-medicines/" + bmId + "/edit";
+    }
+}
Index: src/main/resources/application.properties
===================================================================
--- src/main/resources/application.properties	(revision c87db71f06a0fe440ecc644244f411921061afd0)
+++ src/main/resources/application.properties	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -1,1 +1,18 @@
 spring.application.name=SynergyMed
+
+# 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
+
+# JPA / Hibernate settings
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.show-sql=true
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+
+
+app.upload.branded-medicine-dir=uploads/images/branded_medicine/
+spring.servlet.multipart.max-file-size=5MB
+spring.servlet.multipart.max-request-size=10MB
Index: src/main/resources/templates/branded-medicine-form.html
===================================================================
--- src/main/resources/templates/branded-medicine-form.html	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/resources/templates/branded-medicine-form.html	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -0,0 +1,233 @@
+<!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}
+        .section-title{margin:24px 0 10px; font-weight:800; color:#334155}
+        .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)}
+        .btn-upload{background:#fff; color:#20b2aa; border:2px dashed rgba(32,178,170,.45)}
+        .btn:hover{transform:translateY(-1px)}
+
+        /* Gallery (separate from main form to avoid nested forms) */
+        .gallery{ padding:0 24px 24px 24px; }
+        .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; }
+        .chip{ margin-top:8px; color:#20b2aa; font-weight:700; text-align:center; }
+        .icon-btn{
+            background:#fff; border:1px solid #e5e7eb; border-radius:50%; width:28px; height:28px;
+            cursor:pointer; line-height:26px; text-align:center; font-weight:700;
+        }
+        .small-btn{
+            background:#fff; border:2px solid rgba(32,178,170,.25); color:#20b2aa;
+            padding:6px 10px; border-radius:10px; cursor:pointer; font-weight:600;
+        }
+        @media (max-width:720px){ .row{grid-template-columns:1fr} }
+    </style>
+</head>
+<body>
+<div class="wrap">
+    <div class="head">
+        <h2 th:text="${mode=='create' ? 'Create Branded Medicine' : 'Edit Branded Medicine'}">Form</h2>
+    </div>
+
+    <div class="body">
+        <!-- CREATE MODE: one form, two submit targets using formaction -->
+        <form th:if="${mode=='create'}"
+              th:action="@{/branded-medicines}"  <!-- default for the 'Create' button -->
+        method="post" enctype="multipart/form-data">
+
+        <div class="row">
+            <div>
+                <label>Manufacturer</label>
+                <select name="manufacturerId" required>
+                    <option value="" disabled selected>Select manufacturer</option>
+                    <option th:each="m : ${manufacturers}" th:value="${m.id}" th:text="${m.company.companyName}">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" required/>
+            </div>
+        </div>
+
+        <div class="row">
+            <div>
+                <label>Dosage Form</label>
+                <input type="text" name="dosageForm" required/>
+            </div>
+            <div>
+                <label>Strength</label>
+                <input type="text" name="strength" required/>
+            </div>
+        </div>
+
+        <div class="row">
+            <div>
+                <label>Origin Country</label>
+                <input type="text" name="originCountry"/>
+            </div>
+            <div>
+                <label>Name</label>
+                <input type="text" name="name" required/>
+            </div>
+        </div>
+
+        <div class="row-1">
+            <div>
+                <label>Description</label>
+                <textarea name="description"></textarea>
+            </div>
+            <div>
+                <label>Images</label>
+                <input type="file" name="images" multiple accept="image/*"/>
+                <div class="hint">PNG, JPG, GIF, WEBP up to 5MB each. Uploaded files are saved with the record.</div>
+            </div>
+        </div>
+
+        <div class="actions">
+            <!-- Upload (create the record with images, then stay on edit to choose main) -->
+            <button class="btn btn-upload" type="submit"
+                    th:formaction="@{/branded-medicines/create-and-stay}">
+                Upload
+            </button>
+
+            <!-- Create (create with images and return home) -->
+            <button class="btn btn-primary" type="submit">
+                Create
+            </button>
+
+            <a class="btn btn-secondary" th:href="@{/}">Cancel</a>
+        </div>
+        </form>
+
+        <!-- EDIT MODE: update fields and exit to home -->
+        <form th:if="${mode=='edit'}"
+              th:action="@{/branded-medicines/{id}/update-and-exit(id=${bm.id})}"
+              method="post" enctype="multipart/form-data">
+
+            <div class="row">
+                <div>
+                    <label>Manufacturer</label>
+                    <select name="manufacturerId" required>
+                        <option th:each="m : ${manufacturers}"
+                                th:value="${m.id}"
+                                th:text="${m.company.companyName}"
+                                th:selected="${bm != null 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="${bm.price}" required/>
+                </div>
+            </div>
+
+            <div class="row">
+                <div>
+                    <label>Dosage Form</label>
+                    <input type="text" name="dosageForm" th:value="${bm.dosageForm}" required/>
+                </div>
+                <div>
+                    <label>Strength</label>
+                    <input type="text" name="strength" th:value="${bm.strength}" required/>
+                </div>
+            </div>
+
+            <div class="row">
+                <div>
+                    <label>Origin Country</label>
+                    <input type="text" name="originCountry" th:value="${bm.originCountry}"/>
+                </div>
+                <div>
+                    <label>Name</label>
+                    <input type="text" name="name" th:value="${bm.name}" required/>
+                </div>
+            </div>
+
+            <div class="row-1">
+                <div>
+                    <label>Description</label>
+                    <textarea name="description" th:text="${bm.description}"></textarea>
+                </div>
+                <div>
+                    <label>Append Images</label>
+                    <input type="file" name="images" multiple accept="image/*"/>
+                    <div class="hint">Newly selected images will be appended and saved on Update.</div>
+                </div>
+            </div>
+
+            <div class="actions">
+                <!-- Update (save fields and images, then go home) -->
+                <button class="btn btn-primary" type="submit"
+                        th:formaction="@{/branded-medicines/{id}/update(id=${bm.id})}">
+                    Update
+                </button>
+
+                <!-- Update & Exit (save fields only, exit) -->
+                <button class="btn btn-secondary" type="submit">
+                    Update & Exit
+                </button>
+
+                <a class="btn btn-secondary" th:href="@{/}">Cancel</a>
+            </div>
+        </form>
+    </div>
+
+    <!-- IMAGE GALLERY (outside any form to avoid nested forms) -->
+    <div class="gallery" th:if="${mode=='edit' and images != null and !images.isEmpty()}">
+        <div class="grid">
+            <div class="img-card" th:each="img : ${images}">
+                <img class="thumb" th:src="@{${img.image}}" alt="image"/>
+
+                <!-- Delete (standalone form) -->
+                <form th:action="@{/branded-medicines/{bmId}/images/{imageId}/delete(bmId=${bm.id},imageId=${img.id})}"
+                      method="post" style="position:absolute;top:6px;right:6px;">
+                    <button type="submit" class="icon-btn" title="Remove">×</button>
+                </form>
+
+                <!-- Main badge or Set as main (standalone form) -->
+                <div th:if="${img.mainImage}" class="chip">Main</div>
+                <form th:if="${!img.mainImage}"
+                      th:action="@{/branded-medicines/{bmId}/images/{imageId}/set-main(bmId=${bm.id},imageId=${img.id})}"
+                      method="post" style="margin-top:8px;text-align:center;">
+                    <button type="submit" class="small-btn">Set as main</button>
+                </form>
+            </div>
+        </div>
+    </div>
+
+</div>
+</body>
+</html>
Index: src/main/resources/templates/index.html
===================================================================
--- src/main/resources/templates/index.html	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
+++ src/main/resources/templates/index.html	(revision 0316dec0ce0fab272562e850a37b7653804de51f)
@@ -0,0 +1,57 @@
+<!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">
+    <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}
+        body{font-family:'Segoe UI',Tahoma,Geneva,Verdana,sans-serif;min-height:100vh;background:linear-gradient(135deg,#a4ecba 0%,#fefeff 100%);color:var(--text);padding:28px;display:flex;justify-content:center}
+        .page{width:100%;max-width:1200px}
+        .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){body{padding:16px}.header{padding:16px}}
+    </style>
+</head>
+<body>
+<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">
+                            <!-- Add CSRF hidden input if Spring Security is active -->
+                            <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>
+</body>
+</html>
