Index: backend/.gitignore
===================================================================
--- backend/.gitignore	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/.gitignore	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -9,4 +9,5 @@
 
 .env
+./src/main/java/com/shifterwebapp/shifter/external/service-account.json
 
 ### IntelliJ IDEA ###
Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/pom.xml	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -161,4 +161,16 @@
 			<version>v3-rev20250404-2.0.0</version>
 		</dependency>
+		<dependency>
+			<groupId>com.google.auth</groupId>
+			<artifactId>google-auth-library-credentials</artifactId>
+			<version>1.37.1</version>
+		</dependency>
+		<dependency>
+			<groupId>com.google.auth</groupId>
+			<artifactId>google-auth-library-oauth2-http</artifactId>
+			<version>1.37.1</version>
+		</dependency>
+
+
 		<dependency>
 			<groupId>com.google.http-client</groupId>
Index: backend/requests.http
===================================================================
--- backend/requests.http	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/requests.http	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,2 +1,1 @@
-### GET request to example server
-GET http://localhost:8080
+GET localhost:8080/api/test/send-email
Index: backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -29,6 +29,8 @@
 		System.setProperty("GOOGLE_CLIENT_ID", dotenv.get("GOOGLE_CLIENT_ID"));
 		System.setProperty("GOOGLE_CLIENT_SECRET", dotenv.get("GOOGLE_CLIENT_SECRET"));
+		System.setProperty("GOOGLE_REFRESH_TOKEN", dotenv.get("GOOGLE_REFRESH_TOKEN"));
 		System.setProperty("GOOGLE_EXPERT_CALENDAR_ID", dotenv.get("GOOGLE_EXPERT_CALENDAR_ID"));
-		System.setProperty("GOOGLE_REFRESH_TOKEN", dotenv.get("GOOGLE_REFRESH_TOKEN"));
+		System.setProperty("GOOGLE_SERVICE_ACCOUNT_EMAIL", dotenv.get("GOOGLE_SERVICE_ACCOUNT_EMAIL"));
+		System.setProperty("GOOGLE_PRIVATE_KEY", dotenv.get("GOOGLE_PRIVATE_KEY").replace("\\n", "\n"));
 
 		System.setProperty("EMAIL_HOST", dotenv.get("EMAIL_HOST"));
Index: backend/src/main/java/com/shifterwebapp/shifter/TestController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/TestController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/TestController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,28 @@
+package com.shifterwebapp.shifter;
+
+import com.shifterwebapp.shifter.external.email.EmailService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("${api.base.path}/test")
+public class TestController {
+
+    private final EmailService emailService;
+
+    @GetMapping("/send-email")
+    public void sendTestEmail() {
+        emailService.sendCoursePurchaseConfirmation(
+                "borjangjorgjievski1@gmail.com",
+                "Sales Fundamentals",
+                "Test Test",
+                "www.google.com",
+                "Borjan"
+                );
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/RegisterDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/RegisterDto.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/RegisterDto.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,5 +1,5 @@
 package com.shifterwebapp.shifter.auth;
 
-import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.CompanySize;
 import jakarta.validation.constraints.Email;
 import jakarta.validation.constraints.NotBlank;
@@ -21,5 +21,5 @@
     private String name;
 
-    private CompanyType companyType;
+    private CompanySize companySize;
 
     private String workPosition;
Index: backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -35,4 +35,5 @@
                 .authorizeHttpRequests(request -> request
                         .requestMatchers("/api/auth/**").permitAll()
+                        .requestMatchers("/api/test/**").permitAll()
                         .requestMatchers("/api/courses/**").permitAll()
                         .anyRequest().authenticated()
Index: backend/src/main/java/com/shifterwebapp/shifter/course/Course.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -36,8 +36,4 @@
     private Double price;
     
-    private Integer rating;
-    
-    private Integer ratingCount;
-    
     private String descriptionShort;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -7,4 +7,5 @@
 import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
 import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
 import com.shifterwebapp.shifter.course.service.CourseService;
 import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
@@ -130,5 +131,5 @@
         Long userId = details.getUserId();
 
-        List<CourseDtoPreview> recommendedCourses = courseService.getEnrolledCourses(userId);
+        List<CourseDtoPreviewEnrolled> recommendedCourses = courseService.getEnrolledCourses(userId);
         return ResponseEntity.ok(recommendedCourses);
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoBuilder.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoBuilder.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoBuilder.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,149 @@
+package com.shifterwebapp.shifter.course;
+
+import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
+import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
+import com.shifterwebapp.shifter.course.mapper.CourseMapper;
+import com.shifterwebapp.shifter.coursecontent.CourseContentDtoFull;
+import com.shifterwebapp.shifter.courselecture.CourseLectureDtoFull;
+import com.shifterwebapp.shifter.enrollment.Enrollment;
+import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
+import com.shifterwebapp.shifter.enums.EnrollmentStatus;
+import com.shifterwebapp.shifter.review.Review;
+import com.shifterwebapp.shifter.review.ReviewDto;
+import com.shifterwebapp.shifter.review.service.ReviewService;
+import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
+import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressMapper;
+import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Component
+@RequiredArgsConstructor
+public class CourseDtoBuilder {
+
+    private final ReviewService reviewService;
+    private final EnrollmentService enrollmentService;
+    private final UserCourseProgressService userCourseProgressService;
+    private final CourseMapper courseMapper;
+    private final UserCourseProgressMapper userCourseProgressMapper;
+
+    private <T extends CourseDtoPreview> T enrichCourseDto(Course course, T dto) {
+        Double rating = reviewService.getAverageRatingByCourse(course.getId());
+        int contentCount = course.getCourseContents() != null ? course.getCourseContents().size() : 0;
+        int lectureCount = course.getCourseContents() != null
+                ? course.getCourseContents().stream()
+                .mapToInt(content -> content.getCourseLectures() != null
+                        ? content.getCourseLectures().size() : 0)
+                .sum()
+                : 0;
+
+        dto.setAverageRating(rating != null ? rating : 0.0);
+        dto.setCourseContentCount(contentCount);
+        dto.setCourseLectureCount(lectureCount);
+
+        return dto;
+    }
+
+
+    public CourseDtoPreview getCourseDtoPreview(Course course) {
+        CourseDtoPreview courseDtoPreview = courseMapper.toDtoPreview(course);
+        return enrichCourseDto(course, courseDtoPreview);
+    }
+
+    public List<CourseDtoPreview> getCourseDtoPreview(List<Course> courses) {
+        List<CourseDtoPreview> courseDtoPreviewList = new ArrayList<>();
+        for (Course course : courses) {
+            CourseDtoPreview dto = getCourseDtoPreview(course);
+
+            courseDtoPreviewList.add(dto);
+        }
+
+        return courseDtoPreviewList;
+    }
+
+    public CourseDtoDetail getCourseDtoDetail(Course course) {
+        CourseDtoDetail courseDtoDetail = courseMapper.toDtoDetail(course);
+        return enrichCourseDto(course, courseDtoDetail);
+    }
+
+    public List<CourseDtoDetail> getCourseDtoDetail(List<Course> courses) {
+        List<CourseDtoDetail> courseDtoDetailList = new ArrayList<>();
+        for (Course course : courses) {
+            CourseDtoDetail dto = getCourseDtoDetail(course);
+
+            courseDtoDetailList.add(dto);
+        }
+
+        return courseDtoDetailList;
+    }
+
+    public CourseDtoPreviewEnrolled getCourseDtoPreviewEnrolled(Course course, Long userId) {
+        CourseDtoPreviewEnrolled courseDtoEnrolled = courseMapper.toDtoEnrolled(course);
+        Enrollment enrollment = enrollmentService.getEnrollmentByUserAndCourse(userId, courseDtoEnrolled.getId());
+        List<UserCourseProgress> userCourseProgress = userCourseProgressService.getUserCourseProgressByEnrollmentAndCompletedTrue(enrollment.getId());
+        Integer reviewRating = 0;
+        if (reviewService.hasBeenReviewedByUser(userId, course.getId()))
+            reviewRating = reviewService.getReviewByUserAndCourse(userId, course.getId()).getRating();
+
+        courseDtoEnrolled.setLecturesFinishedCount(userCourseProgress.size());
+        courseDtoEnrolled.setRating(reviewRating);
+        courseDtoEnrolled.setIsFinished(enrollment.getEnrollmentStatus() == EnrollmentStatus.COMPLETED);
+
+        return enrichCourseDto(course, courseDtoEnrolled);
+    }
+
+    public List<CourseDtoPreviewEnrolled> getCourseDtoPreviewEnrolled(List<Course> courses, Long userId) {
+        List<CourseDtoPreviewEnrolled> courseDtoPreviewEnrolledList = new ArrayList<>();
+        for (Course course : courses) {
+            CourseDtoPreviewEnrolled dto = getCourseDtoPreviewEnrolled(course, userId);
+
+            courseDtoPreviewEnrolledList.add(dto);
+        }
+
+        return courseDtoPreviewEnrolledList;
+    }
+
+    public CourseDtoFull getCourseDtoFull(Course course, Enrollment enrollment) {
+        List<UserCourseProgress> userCourseProgress = userCourseProgressService.getUserCourseProgressByEnrollment(enrollment.getId());
+
+        Integer reviewRating = reviewService.getReviewByEnrollment(enrollment.getId()).getRating();
+
+        Map<Long, UserCourseProgress> progressMap = userCourseProgress.stream()
+                .collect(Collectors.toMap(
+                        UserCourseProgress::getCourseLectureId,
+                        Function.identity()
+                ));
+
+        CourseDtoFull courseDto = courseMapper.toDtoFull(course);
+
+        courseDto.setRating(reviewRating != null ? reviewRating : 0);
+        courseDto.setIsFinished(enrollment.getEnrollmentStatus() == EnrollmentStatus.COMPLETED);
+        for (CourseContentDtoFull contentDto : courseDto.getCourseContents()) {
+            for (CourseLectureDtoFull lectureDto : contentDto.getCourseLectures()) {
+                UserCourseProgress progress = progressMap.get(lectureDto.getId());
+                lectureDto.setUserCourseProgress(userCourseProgressMapper.toDto(progress));
+            }
+        }
+
+        return courseDto;
+    }
+
+    public List<CourseDtoFull> getCourseDtoFull(List<Course> courses, Enrollment enrollment) {
+        List<CourseDtoFull> courseDtoFullList = new ArrayList<>();
+        for (Course course : courses) {
+            CourseDtoFull dto = getCourseDtoFull(course, enrollment);
+
+            courseDtoFullList.add(dto);
+        }
+
+        return courseDtoFullList;
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -14,5 +14,12 @@
     List<Course> findCoursesByIdNotIn(List<Long> courseIds);
 
-    @Query("select c from Course c order by case when c.ratingCount = 0 then 0 else c.rating/c.ratingCount end desc")
+    @Query("""
+                SELECT c
+                FROM Course c
+                LEFT JOIN c.enrollments e
+                LEFT JOIN e.review r
+                GROUP BY c
+                ORDER BY COALESCE(AVG(r.rating * 1.0), 0) DESC
+            """)
     List<Course> findCoursesOrderedByRating();
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -5,38 +5,14 @@
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 import java.util.List;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class CourseDtoDetail  {
-
-    private Long id;
-
-    private String imageUrl;
-
-    private String color;
-
-    private String titleShort;
-
-    private String title;
-
-    private Difficulty difficulty;
-
-    private Integer durationMinutes;
-
-    private Double price;
-
-    private Integer rating;
-
-    private Integer ratingCount;
-
-    private List<String> skillsGained;
-
-    private List<String> topicsCovered;
-
-//    NEW FOR DETAILED DTO
+public class CourseDtoDetail extends CourseDtoPreview  {
 
     private String descriptionShort;
Index: backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -16,31 +16,11 @@
     private Long id;
 
-    private String imageUrl;
-
-    private String color;
-
     private String titleShort;
 
     private String title;
 
-    private Difficulty difficulty;
+    private Integer rating;
 
-    private Integer durationMinutes;
-
-    private Double price;
-
-    private List<String> skillsGained;
-
-    private List<String> topicsCovered;
-
-    private String descriptionShort;
-
-    private String description;
-
-    private String descriptionLong;
-
-    private List<String> whatWillBeLearned;
-
-    // NEW FOR FULL DTO
+    private Boolean isFinished;
 
     private List<CourseContentDtoFull> courseContents;
Index: backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -29,8 +29,4 @@
     private Double price;
 
-    private Integer rating;
-
-    private Integer ratingCount;
-
     private List<String> skillsGained;
 
@@ -38,4 +34,8 @@
 
     private Integer courseContentCount;
+
+    private Integer courseLectureCount;
+
+    private Double averageRating;
 }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreviewEnrolled.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreviewEnrolled.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreviewEnrolled.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,23 @@
+package com.shifterwebapp.shifter.course.dto;
+
+import com.shifterwebapp.shifter.enums.Difficulty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CourseDtoPreviewEnrolled extends CourseDtoPreview {
+
+    private Integer lecturesFinishedCount;
+
+    private Integer rating;
+
+    private Boolean isFinished;
+}
+
Index: backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapper.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapper.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,51 @@
+package com.shifterwebapp.shifter.course.mapper;
+
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
+import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseMapper {
+
+    // ---- Forward mappings ----
+    CourseDtoPreview toDtoPreview(Course course);
+    List<CourseDtoPreview> toDtoPreview(List<Course> courses);
+
+    CourseDtoDetail toDtoDetail(Course course);
+    List<CourseDtoDetail> toDtoDetail(List<Course> courses);
+
+    CourseDtoPreviewEnrolled toDtoEnrolled(Course course);
+    List<CourseDtoPreviewEnrolled> toDtoEnrolled(List<Course> courses);
+
+    CourseDtoFull toDtoFull(Course course);
+    List<CourseDtoFull> toDtoFull(List<Course> courses);
+
+    // ---- Inverse mappings (explicitly reference which to invert) ----
+    @InheritInverseConfiguration(name = "toDtoPreview")
+    Course toEntityPreview(CourseDtoPreview courseDto);
+    @InheritInverseConfiguration(name = "toDtoPreview")
+    List<Course> toEntityPreview(List<CourseDtoPreview> courseDtos);
+
+    @InheritInverseConfiguration(name = "toDtoDetail")
+    Course toEntityDetail(CourseDtoDetail courseDto);
+    @InheritInverseConfiguration(name = "toDtoDetail")
+    List<Course> toEntityDetail(List<CourseDtoDetail> courseDtos);
+
+    @InheritInverseConfiguration(name = "toDtoEnrolled")
+    Course toEntityEnrolled(CourseDtoPreviewEnrolled courseDto);
+    @InheritInverseConfiguration(name = "toDtoEnrolled")
+    List<Course> toEntityEnrolled(List<CourseDtoPreviewEnrolled> courseDtos);
+
+    @InheritInverseConfiguration(name = "toDtoFull")
+    Course toEntityFull(CourseDtoFull courseDto);
+    @InheritInverseConfiguration(name = "toDtoFull")
+    List<Course> toEntityFull(List<CourseDtoFull> courseDtos);
+}
+
+
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperDetail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperDetail.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package com.shifterwebapp.shifter.course.mapper;
-
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseMapperDetail {
-
-    CourseDtoDetail toDto(Course course);
-    List<CourseDtoDetail> toDto(List<Course> courses);
-
-    @InheritInverseConfiguration
-    Course toEntity(CourseDtoDetail courseDto);
-    @InheritInverseConfiguration
-    List<Course> toEntity(List<CourseDtoDetail> courseDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperFull.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package com.shifterwebapp.shifter.course.mapper;
-
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseMapperFull {
-
-    CourseDtoFull toDto(Course course);
-    List<CourseDtoFull> toDto(List<Course> courses);
-
-    @InheritInverseConfiguration
-    Course toEntity(CourseDtoFull courseDto);
-    @InheritInverseConfiguration
-    List<Course> toEntity(List<CourseDtoFull> courseDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperPreview.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.course.mapper;
-
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseMapperPreview {
-
-    @Mapping(target = "courseContentCount", expression = "java(course.getCourseContents() != null ? course.getCourseContents().size() : 0)")
-    CourseDtoPreview toDto(Course course);
-    List<CourseDtoPreview> toDto(List<Course> courses);
-
-    @InheritInverseConfiguration
-    Course toEntity(CourseDtoPreview courseDto);
-    @InheritInverseConfiguration
-    List<Course> toEntity(List<CourseDtoPreview> courseDtos);
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -8,7 +8,6 @@
 import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
 import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
-import com.shifterwebapp.shifter.course.mapper.CourseMapperDetail;
-import com.shifterwebapp.shifter.course.mapper.CourseMapperFull;
-import com.shifterwebapp.shifter.course.mapper.CourseMapperPreview;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
+import com.shifterwebapp.shifter.course.mapper.CourseMapper;
 import com.shifterwebapp.shifter.coursecontent.CourseContent;
 import com.shifterwebapp.shifter.coursecontent.CourseContentDtoFull;
@@ -23,5 +22,4 @@
 import com.shifterwebapp.shifter.user.service.UserService;
 import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressDto;
 import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressMapper;
 import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
@@ -40,12 +38,9 @@
 
     private final CourseRepository courseRepository;
-    private final CourseMapperPreview courseMapperPreview;
-    private final CourseMapperDetail courseMapperDetail;
-    private final CourseMapperFull courseMapperFull;
-    private final UserCourseProgressMapper userCourseProgressMapper;
+    private final CourseMapper courseMapper;
     private final UserService userService;
-    private final UserCourseProgressService userCourseProgressService;
     private final Validate validate;
     private final EnrollmentService enrollmentService;
+    private final CourseDtoBuilder courseDtoBuilder;
 
 
@@ -54,6 +49,4 @@
         ObjectMapper objectMapper = new ObjectMapper();
         Course course = objectMapper.readValue(courseJson, Course.class);
-        course.setRating(0);
-        course.setRatingCount(0);
 
         for (CourseContent content : course.getCourseContents()) {
@@ -129,24 +122,8 @@
             throw new AccessDeniedException("User with ID " + userId + " is not enrolled in course with ID " + courseId + " and is therefore not authorized to access the full course with its content!");
         }
-
-        List<UserCourseProgress> userCourseProgress = userCourseProgressService.getUserCourseProgressByEnrollment(enrollment.getId());
-
-        Map<Long, UserCourseProgress> progressMap = userCourseProgress.stream()
-                .collect(Collectors.toMap(
-                        UserCourseProgress::getCourseLectureId,
-                        Function.identity()
-                ));
-
+        enrollmentService.updateEnrollmentStatusToActive(enrollment);
         Course course = courseRepository.findById(courseId).orElseThrow();
-        CourseDtoFull courseDto = courseMapperFull.toDto(course);
-
-        for (CourseContentDtoFull contentDto : courseDto.getCourseContents()) {
-            for (CourseLectureDtoFull lectureDto : contentDto.getCourseLectures()) {
-                UserCourseProgress progress = progressMap.get(lectureDto.getId());
-                lectureDto.setUserCourseProgress(userCourseProgressMapper.toDto(progress));
-            }
-        }
-
-        return courseDto;
+
+        return courseDtoBuilder.getCourseDtoFull(course, enrollment);
     }
 
@@ -156,5 +133,5 @@
                 courseRepository.findCoursesByIdNotIn(courseIds) :
                 courseRepository.findAll();
-        return courseMapperPreview.toDto(courses);
+        return courseDtoBuilder.getCourseDtoPreview(courses);
     }
 
@@ -204,13 +181,17 @@
                 .stream()
                 .map(ScoredCourse::getCourse)
-                .map(courseMapperPreview::toDto)
+                .map(courseDtoBuilder::getCourseDtoPreview)
                 .toList();
     }
 
     @Override
-    public List<CourseDtoPreview> getEnrolledCourses(Long userId) {
+    public List<CourseDtoPreviewEnrolled> getEnrolledCourses(Long userId) {
         List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
         List<Course> courses = courseRepository.findAllById(enrolledCourseIds);
-        return courseMapperPreview.toDto(courses);
+
+        if (courses.isEmpty()) {
+            return new ArrayList<>();
+        }
+        return courseDtoBuilder.getCourseDtoPreviewEnrolled(courses, userId);
     }
 
@@ -220,5 +201,5 @@
         List<Course> courses = courseRepository.findCoursesOrderedByRating();
         int limit = Math.min(5, courses.size());
-        return courseMapperPreview.toDto(
+        return courseDtoBuilder.getCourseDtoPreview(
                 courses
                         .subList(0, limit)
@@ -230,5 +211,5 @@
         List<Course> courses = courseRepository.findCoursesOrderedByPopularity();
         int limit = Math.min(5, courses.size());
-        return courseMapperPreview.toDto(
+        return courseDtoBuilder.getCourseDtoPreview(
                 courses
                         .subList(0, limit)
@@ -236,10 +217,9 @@
     }
 
-
     @Override
     public CourseDtoDetail getCourseById(Long courseId) {
         validate.validateCourseExists(courseId);
         Course course = courseRepository.findById(courseId).orElseThrow();
-        return courseMapperDetail.toDto(course);
+        return courseDtoBuilder.getCourseDtoDetail(course);
     }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -6,4 +6,5 @@
 import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
 import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
 import com.shifterwebapp.shifter.upload.S3UploadResponse;
 
@@ -23,5 +24,5 @@
     List<CourseDtoPreview> getAllCourses(List<Long> courseIds);
     List<CourseDtoPreview> getRecommendedCourses(Long userId);
-    List<CourseDtoPreview> getEnrolledCourses(Long userId);
+    List<CourseDtoPreviewEnrolled> getEnrolledCourses(Long userId);
     List<CourseDtoPreview> getTopRatedCourses();
     List<CourseDtoPreview> getMostPopularCourses();
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -9,5 +9,5 @@
 import lombok.*;
 
-import java.util.Date;
+import java.time.LocalDate;
 import java.util.List;
 
@@ -26,5 +26,9 @@
     private EnrollmentStatus enrollmentStatus;
 
-    private Date date;
+    private LocalDate date;
+
+    private LocalDate activatedAt;
+
+    private LocalDate completedAt;
 
     @OneToOne(cascade = CascadeType.PERSIST, orphanRemoval = true)  // Persist ???? Orphan removal ????
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -8,4 +8,5 @@
 import lombok.NoArgsConstructor;
 
+import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
@@ -18,5 +19,5 @@
     private EnrollmentStatus enrollmentStatus;
 
-    private Date date;
+    private LocalDate date;
 
     private Long courseId;
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -12,4 +12,5 @@
 import com.shifterwebapp.shifter.exception.AlreadyEnrolledException;
 import com.shifterwebapp.shifter.exception.PaymentNotCompleteException;
+import com.shifterwebapp.shifter.external.email.EmailService;
 import com.shifterwebapp.shifter.payment.Payment;
 import com.shifterwebapp.shifter.payment.service.PaymentService;
@@ -17,13 +18,14 @@
 import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
 import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressRepository;
+import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
+import java.time.LocalDate;
 import java.util.List;
 
 @Service
 @RequiredArgsConstructor
-public class EnrollmentService implements ImplEnrollmentService{
+public class EnrollmentService implements ImplEnrollmentService {
 
     private final EnrollmentRepository enrollmentRepository;
@@ -33,4 +35,5 @@
     private final PaymentService paymentService;
     private final EnrollmentMapper enrollmentMapper;
+    private final EmailService emailService;
     private final Validate validate;
 
@@ -91,5 +94,5 @@
         Enrollment enrollment = Enrollment.builder()
                 .enrollmentStatus(EnrollmentStatus.PENDING)
-                .date(new Date())
+                .date(LocalDate.now())
                 .payment(payment)
                 .review(null)
@@ -114,4 +117,18 @@
         userCourseProgressRepository.saveAll(progressList);
 
+        String courseTitleFormatted = course.getTitleShort()
+                .toLowerCase()
+                .trim()
+                .replaceAll("\\s+", "-")
+                .replaceAll("-+", "-");
+
+        emailService.sendCoursePurchaseConfirmation(
+                payment.getUser().getEmail(),
+                course.getTitle(),
+                course.getDescription(),
+                "http://localhost:5173/learn/" + course.getId() + "/" + courseTitleFormatted,
+                payment.getUser().getName()
+        );
+
         return enrollmentMapper.toDto(enrollment);
     }
@@ -126,31 +143,44 @@
 
     @Override
-    public EnrollmentDto updateEnrollmentStatusToActive(Long enrollmentId) {
-        validate.validateEnrollmentExists(enrollmentId);
+    public EnrollmentDto updateEnrollmentStatusToActive(Enrollment enrollment) {
+        validate.validateEnrollmentExists(enrollment.getId());
 
-        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
-        enrollment.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
-        enrollmentRepository.save(enrollment);
+        if (enrollment.getEnrollmentStatus() == EnrollmentStatus.PENDING) {
+            enrollment.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
+            enrollment.setActivatedAt(LocalDate.now());
+            enrollmentRepository.save(enrollment);
+        }
 
         return enrollmentMapper.toDto(enrollment);
     }
 
-    // CALLING user SERVICE HERE. IS THERE A BETTER WAY FOR THIS ???
     @Override
     public EnrollmentDto updateEnrollmentStatusToCompleted(Long enrollmentId) {
         validate.validateEnrollmentExists(enrollmentId);
 
+        List<UserCourseProgress> userCourseProgresses = userCourseProgressRepository.findByEnrollmentId(enrollmentId);
+
+        boolean allCompleted = userCourseProgresses.stream().allMatch(UserCourseProgress::isCompleted);
+
         Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
-        enrollment.setEnrollmentStatus(EnrollmentStatus.COMPLETED);
 
-        Long userId = enrollment.getPayment().getUser().getId();
-        List<String> skillsGained = enrollment.getCourse().getSkillsGained();
-        userService.addPoints(userId, PointsConstants.BUY_COURSE);
-        userService.addSkills(userId, skillsGained);
-        userService.removeDesiredSkills(userId, skillsGained);
+        if (allCompleted) {
+            enrollment.setEnrollmentStatus(EnrollmentStatus.COMPLETED);
+            enrollment.setCompletedAt(LocalDate.now());
+            enrollmentRepository.save(enrollment);
 
-        enrollmentRepository.save(enrollment);
+            Long userId = enrollment.getPayment().getUser().getId();
+            List<String> skillsGained = enrollment.getCourse().getSkillsGained();
+            userService.addPoints(userId, PointsConstants.BUY_COURSE);
+            userService.addSkills(userId, skillsGained);
+            userService.removeDesiredSkills(userId, skillsGained);
+        }
 
         return enrollmentMapper.toDto(enrollment);
     }
+
+    @Override
+    public Enrollment saveEnrollment(Enrollment enrollment) {
+        return enrollmentRepository.save(enrollment);
+    }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -18,5 +18,7 @@
     Boolean isUserEnrolledInCourse(Long userId, Long courseId);
 
-    EnrollmentDto updateEnrollmentStatusToActive(Long enrollmentId);
+    EnrollmentDto updateEnrollmentStatusToActive(Enrollment enrollment);
     EnrollmentDto updateEnrollmentStatusToCompleted(Long enrollmentId);
+
+    Enrollment saveEnrollment(Enrollment enrollment);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/CompanySize.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/CompanySize.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/CompanySize.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,11 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum CompanySize {
+    FREELANCE,
+    MICRO,
+    SMALL,
+    MEDIUM,
+    MID_MARKET,
+    ENTERPRISE,
+    OTHER
+}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,10 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum CompanyType {
-    FREELANCE,
-    STARTUP,
-    SME,
-    MID_MARKET,
-    ENTERPRISE,
-    OTHER
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -43,5 +43,5 @@
     public ResponseEntity<String> handleGoogleCalendarException(GoogleCalendarException e) {
         e.printStackTrace();
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Google Calendar error: " + e.getMessage());
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Google Calendar error: " + e.getMessage() + ". Needs re-authentication: " + e.isNeedsReauth());
     }
 
@@ -57,4 +57,9 @@
     }
 
+    @ExceptionHandler(IllegalStateException.class)
+    public ResponseEntity<ErrorResponse> handleIllegalStateException(IllegalStateException ex) {
+        return ResponseEntity.status(HttpStatus.CONFLICT).body(new ErrorResponse(ex.getMessage()));
+    }
+
     @ExceptionHandler(MultipartException.class)
     public ResponseEntity<?> handleMultipartException(MultipartException ex) {
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/GoogleCalendarException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/GoogleCalendarException.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/GoogleCalendarException.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -2,6 +2,13 @@
 
 public class GoogleCalendarException extends RuntimeException {
-    public GoogleCalendarException(String message, Throwable cause) {
+    private final boolean needsReauth;
+
+    public GoogleCalendarException(String message, Throwable cause, boolean needsReauth) {
         super(message, cause);
+        this.needsReauth = needsReauth;
+    }
+
+    public boolean isNeedsReauth() {
+        return needsReauth;
     }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/external/GoogleCalendarService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/GoogleCalendarService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/GoogleCalendarService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -3,22 +3,16 @@
 import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
 import com.google.api.client.json.gson.GsonFactory;
-import com.google.api.client.auth.oauth2.Credential;
 import com.google.api.client.util.DateTime;
 import com.google.api.services.calendar.Calendar;
 import com.google.api.services.calendar.model.*;
-import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
-import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
-import com.google.api.client.util.store.MemoryDataStoreFactory;
-
-import java.io.StringReader;
-import java.util.Collections;
-
+import com.google.auth.http.HttpCredentialsAdapter;
+import com.google.auth.oauth2.GoogleCredentials;
+import com.google.auth.oauth2.ServiceAccountCredentials;
 import com.shifterwebapp.shifter.exception.GoogleCalendarException;
 import lombok.Getter;
-import lombok.Setter;
 import org.springframework.stereotype.Service;
 
+import java.io.InputStream;
 import java.time.*;
-import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
@@ -30,65 +24,38 @@
     private static final GsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
 
-    private final String clientId = System.getProperty("GOOGLE_CLIENT_ID");
-    private final String clientSecret = System.getProperty("GOOGLE_CLIENT_SECRET");
-
     @Getter
     private final String expertCalendarId = System.getProperty("GOOGLE_EXPERT_CALENDAR_ID");
 
-    @Getter
-    @Setter
-    private String refreshToken = System.getProperty("GOOGLE_REFRESH_TOKEN");
+    private final Calendar calendarService;
 
+    public GoogleCalendarService() {
+        this.calendarService = initService();
+    }
 
     /**
-     * Builds Google Credential object with tokens.
-     * Automatically refreshes access token if expired.
+     * Initialize Google Calendar service using the service-account.json
      */
-    private Credential getCredential() throws Exception {
-        var httpTransport = GoogleNetHttpTransport.newTrustedTransport();
-        var jsonFactory = GsonFactory.getDefaultInstance();
+    private Calendar initService() {
+        try {
+            InputStream serviceAccountStream = getClass().getResourceAsStream("/service-account.json");
+            if (serviceAccountStream == null) {
+                throw new GoogleCalendarException("Service account JSON not found in classpath", null, false);
+            }
 
-        // Build client secrets
-        String clientSecretsJson = String.format("""
-        {
-          "installed": {
-            "client_id": "%s",
-            "client_secret": "%s",
-            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
-            "token_uri": "https://oauth2.googleapis.com/token"
-          }
+            GoogleCredentials credentials = GoogleCredentials.fromStream(serviceAccountStream)
+                    .createScoped(Collections.singletonList("https://www.googleapis.com/auth/calendar"));
+
+            return new Calendar.Builder(
+                    GoogleNetHttpTransport.newTrustedTransport(),
+                    JSON_FACTORY,
+                    new HttpCredentialsAdapter(credentials)
+            ).setApplicationName(APPLICATION_NAME).build();
+
+        } catch (Exception e) {
+            throw new GoogleCalendarException("Failed to initialize Google Calendar service", e, false);
         }
-        """, clientId, clientSecret);
-
-        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new StringReader(clientSecretsJson));
-
-        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
-                httpTransport,
-                jsonFactory,
-                clientSecrets,
-                Collections.singleton("https://www.googleapis.com/auth/calendar.events") // only this scope
-        )
-                .setDataStoreFactory(new MemoryDataStoreFactory())
-                .setAccessType("offline")
-                .setApprovalPrompt("force")
-                .build();
-
-        // Create credential using refresh token
-        var tokenResponse = new com.google.api.client.auth.oauth2.TokenResponse()
-                .setRefreshToken(refreshToken);
-
-        Credential credential = flow.createAndStoreCredential(tokenResponse, "user-id");
-
-        // Refresh if needed
-        if (credential.getExpiresInSeconds() == null || credential.getExpiresInSeconds() <= 60) {
-            if (!credential.refreshToken()) {
-                throw new RuntimeException("Failed to refresh Google access token");
-            }
-        }
-
-        return credential;
     }
 
-
+    /* ==================== FREE/BUSY & SLOTS ==================== */
 
     public Map<String, List<String>> computeFreeSlotsByDate(
@@ -100,5 +67,4 @@
 
         Map<String, List<String>> freeSlotsByDate = new LinkedHashMap<>();
-
         ZonedDateTime cursorDay = scheduleStart.truncatedTo(ChronoUnit.DAYS);
 
@@ -111,8 +77,6 @@
 
                 ZonedDateTime cursorSlot = workdayStart;
-
                 while (cursorSlot.plusMinutes(slotDurationMinutes).compareTo(workdayEnd) <= 0) {
                     ZonedDateTime slotEnd = cursorSlot.plusMinutes(slotDurationMinutes);
-
                     Instant slotStartInstant = cursorSlot.toInstant();
                     Instant slotEndInstant = slotEnd.toInstant();
@@ -125,5 +89,4 @@
                         String date = userTimeSlot.toLocalDate().toString();
                         String time = userTimeSlot.toLocalTime().truncatedTo(ChronoUnit.MINUTES).toString();
-
                         freeSlotsByDate.computeIfAbsent(date, k -> new ArrayList<>()).add(time);
                     }
@@ -138,19 +101,15 @@
     }
 
-
     public boolean isSlotFree(FreeBusyResponse freeBusy, ZonedDateTime start, ZonedDateTime end) {
-        DayOfWeek startDay = start.getDayOfWeek();
-        DayOfWeek endDay = end.getDayOfWeek();
-        if (startDay == DayOfWeek.SATURDAY || startDay == DayOfWeek.SUNDAY
-                || endDay == DayOfWeek.SATURDAY || endDay == DayOfWeek.SUNDAY) {
+        if (start.getDayOfWeek() == DayOfWeek.SATURDAY || start.getDayOfWeek() == DayOfWeek.SUNDAY
+                || end.getDayOfWeek() == DayOfWeek.SATURDAY || end.getDayOfWeek() == DayOfWeek.SUNDAY) {
             return false;
         }
 
-        var busyList = freeBusy.getCalendars().get(getExpertCalendarId()).getBusy();
+        var busyList = freeBusy.getCalendars().get(expertCalendarId).getBusy();
         for (var interval : busyList) {
             Instant busyStart = Instant.ofEpochMilli(interval.getStart().getValue());
             Instant busyEnd = Instant.ofEpochMilli(interval.getEnd().getValue());
-            TimeInterval busyInterval = new TimeInterval(busyStart, busyEnd);
-            if (busyInterval.overlaps(start.toInstant(), end.toInstant())) {
+            if (!(busyEnd.isBefore(start.toInstant()) || busyStart.isAfter(end.toInstant()))) {
                 return false;
             }
@@ -161,24 +120,13 @@
     public FreeBusyResponse queryFreeBusy(Instant start, Instant end) {
         try {
-            Calendar service = new Calendar.Builder(
-                    GoogleNetHttpTransport.newTrustedTransport(),
-                    JSON_FACTORY,
-                    getCredential()
-            )
-                    .setApplicationName(APPLICATION_NAME)
-                    .build();
+            FreeBusyRequest fbRequest = new FreeBusyRequest()
+                    .setTimeMin(new DateTime(Date.from(start)))
+                    .setTimeMax(new DateTime(Date.from(end)))
+                    .setTimeZone("Europe/Skopje")
+                    .setItems(Collections.singletonList(new FreeBusyRequestItem().setId(expertCalendarId)));
 
-            FreeBusyRequest fbRequest = new FreeBusyRequest();
-            fbRequest.setTimeMin(new DateTime(Date.from(start)));
-            fbRequest.setTimeMax(new DateTime(Date.from(end)));
-            fbRequest.setTimeZone("Europe/Skopje");
-            fbRequest.setItems(Collections.singletonList(
-                    new FreeBusyRequestItem().setId(expertCalendarId)
-            ));
-
-            return service.freebusy().query(fbRequest).execute();
-
+            return calendarService.freebusy().query(fbRequest).execute();
         } catch (Exception e) {
-            throw new GoogleCalendarException("Failed to query free/busy times", e);
+            throw new GoogleCalendarException("Failed to query free/busy times", e, false);
         }
     }
@@ -186,26 +134,13 @@
     public String createEvent(String title, Instant start, Instant end) {
         try {
-            Calendar service = new Calendar.Builder(
-                    GoogleNetHttpTransport.newTrustedTransport(),
-                    JSON_FACTORY,
-                    getCredential()
-            )
-                    .setApplicationName(APPLICATION_NAME)
-                    .build();
-
             Event event = new Event()
                     .setSummary(title)
-                    .setStart(new EventDateTime()
-                            .setDateTime(new DateTime(start.toEpochMilli()))
-                            .setTimeZone("Europe/Skopje"))
-                    .setEnd(new EventDateTime()
-                            .setDateTime(new DateTime(end.toEpochMilli()))
-                            .setTimeZone("Europe/Skopje"));
+                    .setStart(new EventDateTime().setDateTime(new DateTime(start.toEpochMilli())).setTimeZone("Europe/Skopje"))
+                    .setEnd(new EventDateTime().setDateTime(new DateTime(end.toEpochMilli())).setTimeZone("Europe/Skopje"));
 
-            Event createdEvent = service.events().insert(getExpertCalendarId(), event).execute();
-
+            Event createdEvent = calendarService.events().insert(expertCalendarId, event).execute();
             return createdEvent.getId();
         } catch (Exception e) {
-            throw new GoogleCalendarException("Failed to create event", e);
+            throw new GoogleCalendarException("Failed to create event", e, false);
         }
     }
@@ -213,23 +148,12 @@
     public void deleteEvent(String eventId) {
         try {
-            Calendar service = new Calendar.Builder(
-                    GoogleNetHttpTransport.newTrustedTransport(),
-                    JSON_FACTORY,
-                    getCredential()
-            )
-                    .setApplicationName(APPLICATION_NAME)
-                    .build();
-
-            service.events().delete(getExpertCalendarId(), eventId).execute();
+            calendarService.events().delete(expertCalendarId, eventId).execute();
         } catch (Exception e) {
-            throw new GoogleCalendarException("Failed to delete event with ID: " + eventId, e);
+            throw new GoogleCalendarException("Failed to delete event with ID: " + eventId, e, false);
         }
     }
 
+    /* ==================== TIME INTERVAL CLASS ==================== */
 
-
-    /**
-     * Helper class for time intervals
-     */
     public static class TimeInterval {
         private final Instant start;
@@ -242,5 +166,5 @@
 
         public boolean overlaps(Instant otherStart, Instant otherEnd) {
-            return !start.isAfter(otherEnd) && !end.isBefore(otherStart); // This checks if the intervals overlap. If 12.00-12.30 is taken, 11.30-12.00 and 12.30-13.00 isnt free
+            return !start.isAfter(otherEnd) && !end.isBefore(otherStart);
         }
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/external/ZoomService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/ZoomService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/ZoomService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -4,5 +4,5 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.shifterwebapp.shifter.exception.ZoomMeetingException;
-import com.shifterwebapp.shifter.meeting.ZoomMeetingRequest;
+import com.shifterwebapp.shifter.external.meeting.ZoomMeetingRequest;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.HttpClientErrorException;
Index: backend/src/main/java/com/shifterwebapp/shifter/external/email/ContactReq.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/email/ContactReq.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/email/ContactReq.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,13 @@
+package com.shifterwebapp.shifter.external.email;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ContactReq {
+    public String subject;
+    public String text;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,27 @@
+package com.shifterwebapp.shifter.external.email;
+
+import com.shifterwebapp.shifter.Validate;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("${api.base.path}/emails")
+public class EmailController {
+
+    private final EmailService emailService;
+    private final Validate validate;
+
+    @PostMapping("/contact-us")
+    public ResponseEntity<?> sendEmailToExpert(@RequestBody ContactReq contactReq, Authentication authentication) {
+        validate.validateUserIsAuthenticated(authentication);
+
+        emailService.contactExpert(contactReq);
+        return ResponseEntity.ok().build();
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,11 +1,24 @@
 package com.shifterwebapp.shifter.external.email;
 
-import com.shifterwebapp.shifter.meeting.UserMeetingInfoRequest;
+import com.shifterwebapp.shifter.external.meeting.UserMeetingInfoRequest;
+import jakarta.mail.MessagingException;
 import lombok.RequiredArgsConstructor;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.mail.SimpleMailMessage;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
+import java.time.Year;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+import org.springframework.mail.javamail.MimeMessageHelper;
+import jakarta.mail.internet.MimeMessage;
+import org.springframework.util.FileCopyUtils;
 
 @Service
@@ -15,36 +28,9 @@
     private final JavaMailSender mailSender;
 
-    public void sendFreeConsultationConfirmation(String to, String date, String time, String zoomLink) {
-        String subject = "Your Free Consultation Session is Scheduled - " + date + " at " + time;
-        String text = """
-                Hello,
-                
-                Your free consultation session has been successfully scheduled! 🎉
-                
-                📅 Date: {date} \s
-                ⏰ Time: {time} \s
-                📍 Location: Online - Zoom \s
-                🔗 Meeting Link: {zoomLink} \s
-                
-                This session is designed to understand your current challenges, goals, and preferences.
-                During this session, our expert will provide valuable insights based on your situation.
-                After the session, you will receive a personalized program recommendation tailored to your needs.
-                
-                If you have any questions or need to reschedule, please reply to this email.
-                
-                Excited to help you take the next step! \s
-                
-                Best regards, \s
-                The Shifter Team
-                """;
-        text = text
-                .replace("{date}", date)
-                .replace("{time}", time)
-                .replace("{zoomLink}", zoomLink);
+    public void contactExpert(ContactReq contactReq) {
         SimpleMailMessage message = new SimpleMailMessage();
-        message.setTo(to);
-        message.setSubject(subject);
-        message.setText(text);
-
+        message.setTo(System.getProperty("EMAIL_USERNAME"));
+        message.setSubject("New Contact Message: " + contactReq.getSubject());
+        message.setText(contactReq.getText());
         int maxRetries = 3;
         int attempt = 0;
@@ -56,131 +42,245 @@
                 attempt++;
                 if (attempt >= maxRetries) {
-                    throw new RuntimeException("Failed to send confirmation email after " + attempt + " attempts", e);
-                }
-            }
+                    throw new RuntimeException("Failed to send email to expert after " + attempt + " attempts", e);
+                }
+            }
+        }
+    }
+
+    public void sendCoursePurchaseConfirmation(String to, String courseName, String courseDescription, String accessUrl, String userName) {
+
+        MimeMessage mimeMessage = mailSender.createMimeMessage();
+
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
+
+            helper.setTo(to);
+            helper.setSubject("Welcome to " + courseName + "! Start Learning Now");
+            helper.setFrom("support@shift-er.com");
+
+            int currentYear = Year.now().getValue();
+
+            String htmlTemplate;
+            try {
+                ClassPathResource resource = new ClassPathResource("email-templates/course_purchase_confirmation.html");
+                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
+            } catch (IOException e) {
+                // Throw a runtime exception if the template file can't be loaded
+                throw new UncheckedIOException("Failed to load email template: course_purchase_confirmation.html", e);
+            }
+
+            String htmlContent = htmlTemplate
+                    .replace("${courseName}", courseName)
+                    .replace("${courseDescription}", courseDescription)
+                    .replace("${accessUrl}", accessUrl)
+                    .replace("${currentYear}", String.valueOf(currentYear));
+
+            helper.setText(htmlContent, true);
+
+            int maxRetries = 3;
+            int attempt = 0;
+            while (true) {
+                try {
+                    mailSender.send(mimeMessage);
+                    return;
+                } catch (Exception e) {
+                    attempt++;
+                    if (attempt >= maxRetries) {
+                        throw new RuntimeException("Failed to send HTML email to " + to + " after " + attempt + " attempts", e);
+                    }
+                }
+            }
+
+        } catch (MessagingException e) {
+            throw new RuntimeException("Error preparing email message for " + to, e);
+        }
+    }
+
+    public void sendFreeConsultationConfirmation(String to, String date, String time, String zoomLink) {
+
+        MimeMessage mimeMessage = mailSender.createMimeMessage();
+
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
+
+            String subject = "Your Free Consultation Session is Scheduled - " + date + " at " + time;
+
+            helper.setTo(to);
+            helper.setSubject(subject);
+            helper.setFrom("support@shift-er.com");
+
+            String currentYear = String.valueOf(java.time.Year.now().getValue());
+
+            String htmlTemplate;
+            try {
+                ClassPathResource resource = new ClassPathResource("email-templates/free_consultation_confirmation.html");
+                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
+            } catch (IOException e) {
+                throw new UncheckedIOException("Failed to load email template: free_consultation_confirmation.html", e);
+            }
+
+            String htmlContent = htmlTemplate
+                    .replace("${date}", date)
+                    .replace("${time}", time)
+                    .replace("${zoomLink}", zoomLink)
+                    .replace("${currentYear}", currentYear);
+
+            helper.setText(htmlContent, true);
+
+            int maxRetries = 3;
+            int attempt = 0;
+            while (true) {
+                try {
+                    mailSender.send(mimeMessage);
+                    return;
+                } catch (Exception e) {
+                    attempt++;
+                    if (attempt >= maxRetries) {
+                        throw new RuntimeException("Failed to send HTML email to " + to + " after " + attempt + " attempts", e);
+                    }
+                }
+            }
+
+        } catch (MessagingException e) {
+            throw new RuntimeException("Error preparing email message for " + to, e);
         }
     }
 
     public void sendFreeConsultationReminder(String to, String meetingDate, String meetingTime, String zoomLink) {
+
+        MimeMessage mimeMessage = mailSender.createMimeMessage();
+
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE; // e.g., "2025-10-01"
+
         LocalDate today = LocalDate.now();
+        LocalDate meetingLocalDate = LocalDate.parse(meetingDate, dateFormatter);
 
         String subject;
-        if (LocalDate.parse(meetingDate).isBefore(today))
+        String reminderHeading;
+        String reminderText;
+
+        if (meetingLocalDate.isEqual(today.plusDays(1))) {
             subject = "Reminder: Tomorrow is your Free Consultation Session at " + meetingTime;
-        else
+            reminderHeading = "Your Session is Tomorrow!";
+            reminderText = "This is a friendly reminder that your free consultation session is scheduled for tomorrow. We look forward to meeting with you and helping you plan your next steps!";
+        }
+        else if (meetingLocalDate.isEqual(today)) {
             subject = "Reminder: Free Consultation Session in 2 hours";
-
-        String text = """
-                Hello,
-                
-                This is a friendly reminder for your upcoming free consultation session! ⏰
-                
-                📅 Date: {meetingDate} \s
-                ⏰ Time: {meetingTime} \s
-                📍 Location: Online - Zoom \s
-                🔗 Meeting Link: {zoomLink} \s
-                
-                This session is designed to understand your current challenges, goals, and preferences.
-                During this session, our expert will provide valuable insights based on your situation.
-                After the session, you will receive a personalized program recommendation tailored to your needs.
-                
-                If you have any questions or need to reschedule, please reply to this email.
-                
-                Excited to help you take the next step! \s
-                
-                Best regards, \s
-                The Shifter Team
-                """;
-        text = text
-                .replace("{meetingDate}", meetingDate)
-                .replace("{meetingTime}", meetingTime)
-                .replace("{zoomLink}", zoomLink);
-        SimpleMailMessage message = new SimpleMailMessage();
-        message.setTo(to);
-        message.setSubject(subject);
-        message.setText(text);
-        int maxRetries = 3;
-        int attempt = 0;
-        while (true) {
-            try {
-                mailSender.send(message);
-                return;
-            } catch (Exception e) {
-                attempt++;
-                if (attempt >= maxRetries) {
-                    throw new RuntimeException("Failed to send reminder email after " + attempt + " attempts", e);
-                }
-            }
+            reminderHeading = "Your Session is in 2 Hours!";
+            reminderText = "This is a crucial final reminder. Your free consultation session is starting soon. Please use the link below to join promptly!";
+        }
+        else {
+            System.out.println("Scheduler error: Reminder function called outside of expected time window for meeting on: " + meetingDate);
+            return;
+        }
+
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
+
+            helper.setTo(to);
+            helper.setSubject(subject);
+            helper.setFrom("support@shift-er.com");
+
+            String currentYear = String.valueOf(Year.now().getValue());
+
+            String htmlTemplate;
+            try {
+                ClassPathResource resource = new ClassPathResource("email-templates/consultation_reminder.html");
+                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
+            } catch (IOException e) {
+                throw new UncheckedIOException("Failed to load email template: consultation_reminder.html", e);
+            }
+
+            String htmlContent = htmlTemplate
+                    .replace("${subject}", subject)
+                    .replace("${meetingDate}", meetingDate)
+                    .replace("${meetingTime}", meetingTime)
+                    .replace("${zoomLink}", zoomLink)
+                    .replace("${reminderHeading}", reminderHeading)
+                    .replace("${reminderText}", reminderText)
+                    .replace("${currentYear}", currentYear);
+
+            helper.setText(htmlContent, true);
+
+            int maxRetries = 3;
+            int attempt = 0;
+            while (true) {
+                try {
+                    mailSender.send(mimeMessage);
+                    return;
+                } catch (Exception e) {
+                    attempt++;
+                    if (attempt >= maxRetries) {
+                        throw new RuntimeException("Failed to send HTML reminder email to " + to + " after " + attempt + " attempts", e);
+                    }
+                }
+            }
+
+        } catch (MessagingException e) {
+            throw new RuntimeException("Error preparing email message for " + to, e);
         }
     }
 
     public void sendExpertMeetingInformation(UserMeetingInfoRequest userMeetingInfoRequest, String time, String date, String userTimeZone, String zoomLink) {
+
+        MimeMessage mimeMessage = mailSender.createMimeMessage();
+
+        String expertEmail = System.getProperty("EMAIL_USERNAME");
+
         String subject = "You Have an Upcoming Free Consultation Session - " + date + " at " + time;
 
-        String text = """
-        Hello,
-
-        A new user has booked a free consultation session. Here are their details and the meeting information:
-
-        📅 Date: {date}
-        ⏰ Time: {time}
-        🔗 Zoom Meeting Link: {zoomLink}
-
-        --- User Information ---
-
-        Name: {name}
-        Email: {email}
-        Company Type: {companyType}
-        Work Position: {workPosition}
-        Time Zone: {userTimeZone}
-
-        About the Company:
-        {aboutCompany}
-
-        Current Challenges:
-        {challenges}
-
-        Expectations from the Session:
-        {expectations}
-
-        Additional Information:
-        {otherInfo}
-
-        Please review this information before the session to provide the best personalized guidance.
-
-        Best regards,
-        The Shifter Team
-        """;
-
-        text = text
-                .replace("{date}", date)
-                .replace("{time}", time)
-                .replace("{zoomLink}", zoomLink)
-                .replace("{name}", userMeetingInfoRequest.getName())
-                .replace("{email}", userMeetingInfoRequest.getEmail())
-                .replace("{companyType}", userMeetingInfoRequest.getCompanyType().toString())
-                .replace("{workPosition}", userMeetingInfoRequest.getWorkPosition())
-                .replace("{userTimeZone}", userTimeZone)
-                .replace("{aboutCompany}", userMeetingInfoRequest.getAboutCompany() != null ? userMeetingInfoRequest.getAboutCompany() : "N/A")
-                .replace("{challenges}", userMeetingInfoRequest.getChallenges() != null ? userMeetingInfoRequest.getChallenges() : "N/A")
-                .replace("{expectations}", userMeetingInfoRequest.getExpectations() != null ? userMeetingInfoRequest.getExpectations() : "N/A")
-                .replace("{otherInfo}", userMeetingInfoRequest.getOtherInfo() != null ? userMeetingInfoRequest.getOtherInfo() : "N/A");
-
-        SimpleMailMessage message = new SimpleMailMessage();
-        message.setTo(System.getProperty("EMAIL_USERNAME"));
-        message.setSubject(subject);
-        message.setText(text);
-        int maxRetries = 3;
-        int attempt = 0;
-        while (true) {
-            try {
-                mailSender.send(message);
-                return;
-            } catch (Exception e) {
-                attempt++;
-                if (attempt >= maxRetries) {
-                    throw new RuntimeException("Failed to send expert email with meeting info after " + attempt + " attempts", e);
-                }
-            }
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
+
+            helper.setTo(expertEmail); // Send to the expert's email
+            helper.setSubject(subject);
+            helper.setFrom("support@shift-er.com");
+
+            String currentYear = String.valueOf(Year.now().getValue());
+
+            String htmlTemplate;
+            try {
+                ClassPathResource resource = new ClassPathResource("email-templates/expert_meeting_info.html");
+                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
+            } catch (IOException e) {
+                throw new UncheckedIOException("Failed to load email template: expert_meeting_info.html", e);
+            }
+
+            String htmlContent = htmlTemplate
+                    .replace("${subject}", subject)
+                    .replace("${date}", date)
+                    .replace("${time}", time)
+                    .replace("${zoomLink}", zoomLink)
+                    .replace("${name}", userMeetingInfoRequest.getName())
+                    .replace("${email}", userMeetingInfoRequest.getEmail())
+                    .replace("${companyType}", userMeetingInfoRequest.getCompanySize() != null ? userMeetingInfoRequest.getCompanySize().toString() : "N/A")
+                    .replace("${workPosition}", userMeetingInfoRequest.getWorkPosition())
+                    .replace("${userTimeZone}", userTimeZone)
+                    // Using ternary operators directly for "N/A" fallback
+                    .replace("${aboutCompany}", userMeetingInfoRequest.getAboutCompany() != null ? userMeetingInfoRequest.getAboutCompany() : "N/A")
+                    .replace("${challenges}", userMeetingInfoRequest.getChallenges() != null ? userMeetingInfoRequest.getChallenges() : "N/A")
+                    .replace("${expectations}", userMeetingInfoRequest.getExpectations() != null ? userMeetingInfoRequest.getExpectations() : "N/A")
+                    .replace("${otherInfo}", userMeetingInfoRequest.getOtherInfo() != null ? userMeetingInfoRequest.getOtherInfo() : "N/A")
+                    .replace("${currentYear}", currentYear);
+
+
+            helper.setText(htmlContent, true);
+
+            int maxRetries = 3;
+            int attempt = 0;
+            while (true) {
+                try {
+                    mailSender.send(mimeMessage);
+                    return;
+                } catch (Exception e) {
+                    attempt++;
+                    if (attempt >= maxRetries) {
+                        throw new RuntimeException("Failed to send expert email with meeting info after " + attempt + " attempts", e);
+                    }
+                }
+            }
+
+        } catch (MessagingException e) {
+            throw new RuntimeException("Error preparing email message for expert", e);
         }
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,55 @@
+package com.shifterwebapp.shifter.external.meeting;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.external.meeting.service.MeetingService;
+import com.shifterwebapp.shifter.user.UserDto;
+import com.shifterwebapp.shifter.user.service.UserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("${api.base.path}/meetings")
+public class MeetingController {
+
+    private final UserService userService;
+    private final MeetingService meetingService;
+    private final Validate validate;
+
+    @GetMapping("/free-time-slots")
+    public ResponseEntity<?> getExpertFreeTimeSlots(
+            @RequestParam String userTimeZone,
+            Authentication authentication
+    ) {
+        validate.validateUserIsAuthenticated(authentication);
+
+        Map<String, List<String>> freeSlots = meetingService.getExpertFreeTimeSlots(userTimeZone);
+        return ResponseEntity.ok(freeSlots);
+    }
+
+    @PostMapping("/schedule-free-consultation")
+    public ResponseEntity<?> scheduleMeeting (
+            @RequestBody UserMeetingInfoRequest userMeetingInfoRequest,
+            @RequestParam String startTime,
+            @RequestParam String userTimeZone,
+            @RequestParam String date,
+            Authentication authentication
+    ) {
+        Long userId = validate.extractUserId(authentication);
+        UserDto user = userService.getUserById(userId);
+        userMeetingInfoRequest.setEmail(user.getEmail());
+        userMeetingInfoRequest.setName(user.getName());
+        userMeetingInfoRequest.setCompanySize(user.getCompanySize());
+        userMeetingInfoRequest.setWorkPosition(user.getWorkPosition());
+
+        meetingService.scheduleMeeting(date, startTime, userTimeZone, userMeetingInfoRequest);
+
+
+        return ResponseEntity.ok("Meeting successfully arranged!");
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingUtils.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingUtils.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingUtils.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,44 @@
+package com.shifterwebapp.shifter.external.meeting;
+import org.springframework.stereotype.Component;
+import java.time.*;
+
+@Component
+public class MeetingUtils {
+
+    public static final ZoneId EXPERT_ZONE = ZoneId.of("Europe/Skopje");
+
+    public ZonedDateTime[] getExpertStartEnd(String date, String time, String userTimeZone, int durationMinutes) {
+        ZoneId userZone = ZoneId.of(userTimeZone);
+
+        LocalDate localDate = LocalDate.parse(date);
+        LocalTime localTime = LocalTime.parse(time);
+        ZonedDateTime startUser = ZonedDateTime.of(localDate, localTime, userZone);
+
+        ZonedDateTime startExpert = startUser.withZoneSameInstant(EXPERT_ZONE);
+        ZonedDateTime endExpert = startExpert.plusMinutes(durationMinutes);
+
+        return new ZonedDateTime[]{startExpert, endExpert};
+    }
+
+    public ZoneId parseZone(String zone) {
+        try {
+            return ZoneId.of(zone);
+        } catch (DateTimeException e) {
+            throw new IllegalArgumentException("Invalid time zone: " + zone, e);
+        }
+    }
+
+    public ZonedDateTime calculateScheduleStart(ZonedDateTime now) {
+        DayOfWeek dow = now.getDayOfWeek();
+        int daysToAdd = switch (dow) {
+            case THURSDAY, FRIDAY -> 4;
+            case SATURDAY -> 3;
+            default -> 2;
+        };
+        return now.withHour(8).withMinute(0).withSecond(0).withNano(0).plusDays(daysToAdd);
+    }
+
+    public ZonedDateTime calculateScheduleEnd(ZonedDateTime start) {
+        return start.withHour(16).withMinute(30).withSecond(0).withNano(0).plusDays(9);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/meeting/UserMeetingInfoRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/UserMeetingInfoRequest.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/meeting/UserMeetingInfoRequest.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,28 @@
+package com.shifterwebapp.shifter.external.meeting;
+
+import com.shifterwebapp.shifter.enums.CompanySize;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class UserMeetingInfoRequest {
+
+    private String name;
+
+    private String email;
+
+    private CompanySize companySize;
+
+    private String workPosition;
+
+    private String aboutCompany;
+
+    private String challenges;
+
+    private String expectations;
+
+    private String otherInfo;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/meeting/ZoomMeetingRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/ZoomMeetingRequest.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/meeting/ZoomMeetingRequest.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,33 @@
+package com.shifterwebapp.shifter.external.meeting;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Builder
+public class ZoomMeetingRequest {
+
+    @JsonProperty("topic")
+    private String topic;
+
+    @JsonProperty("start_time")
+    private String startTime; // ISO-8601 format: 2025-08-14T15:00:00Z
+
+    @JsonProperty("duration")
+    private int duration; // in minutes
+
+    @JsonProperty("type")
+    private int type; // 2 = scheduled meeting
+
+    @JsonProperty("timezone")
+    private String timezone;
+
+    // Optional
+    @JsonProperty("agenda")
+    private String agenda;
+
+}
+
Index: backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/ImplMeetingService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/ImplMeetingService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/ImplMeetingService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,14 @@
+package com.shifterwebapp.shifter.external.meeting.service;
+
+import com.shifterwebapp.shifter.external.meeting.UserMeetingInfoRequest;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ImplMeetingService {
+
+    Map<String, List<String>> getExpertFreeTimeSlots(String userTimeZone);
+
+    void scheduleMeeting(String userDate, String userTime, String userTimeZone, UserMeetingInfoRequest userMeetingInfoRequest);
+
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/MeetingService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/MeetingService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/MeetingService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,180 @@
+package com.shifterwebapp.shifter.external.meeting.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.api.services.calendar.model.FreeBusyResponse;
+import com.shifterwebapp.shifter.exception.AccessDeniedException;
+import com.shifterwebapp.shifter.exception.TimeSlotUnavailableException;
+import com.shifterwebapp.shifter.external.email.EmailService;
+import com.shifterwebapp.shifter.external.ZoomService;
+import com.shifterwebapp.shifter.external.GoogleCalendarService;
+import com.shifterwebapp.shifter.external.meeting.MeetingUtils;
+import com.shifterwebapp.shifter.external.meeting.UserMeetingInfoRequest;
+import com.shifterwebapp.shifter.external.meeting.ZoomMeetingRequest;
+import com.shifterwebapp.shifter.scheduledemail.ScheduledEmail;
+import com.shifterwebapp.shifter.scheduledemail.ScheduledEmailService;
+import com.shifterwebapp.shifter.user.service.UserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@RequiredArgsConstructor
+public class MeetingService implements ImplMeetingService {
+
+    private final GoogleCalendarService googleCalendarService;
+    private final ScheduledEmailService scheduledEmailService;
+    private final UserService userService;
+    private final ZoomService zoomService;
+    private final EmailService emailService;
+    private final MeetingUtils meetingUtils;
+
+
+    @Override
+    public Map<String, List<String>> getExpertFreeTimeSlots(String userTimeZone) {
+        ZoneId expertZone = ZoneId.of("Europe/Skopje");
+        ZoneId userZone = meetingUtils.parseZone(userTimeZone);
+
+        ZonedDateTime nowExpert = ZonedDateTime.now(expertZone);
+        ZonedDateTime scheduleStart = meetingUtils.calculateScheduleStart(nowExpert);
+        ZonedDateTime scheduleEnd = meetingUtils.calculateScheduleEnd(scheduleStart);
+
+        FreeBusyResponse freeBusyResponse = googleCalendarService
+                .queryFreeBusy(scheduleStart.toInstant(), scheduleEnd.toInstant());
+
+        String calendarId = googleCalendarService.getExpertCalendarId();
+        if (freeBusyResponse == null
+                || freeBusyResponse.getCalendars() == null
+                || freeBusyResponse.getCalendars().get(calendarId) == null
+                || freeBusyResponse.getCalendars().get(calendarId).getBusy() == null) {
+            throw new IllegalStateException("Invalid FreeBusyResponse from Google API");
+        }
+
+        List<GoogleCalendarService.TimeInterval> busyIntervals = freeBusyResponse
+                .getCalendars()
+                .get(calendarId)
+                .getBusy()
+                .stream()
+                .map(i -> new GoogleCalendarService.TimeInterval(
+                        Instant.ofEpochMilli(i.getStart().getValue()),
+                        Instant.ofEpochMilli(i.getEnd().getValue())))
+                .toList();
+
+        return googleCalendarService.computeFreeSlotsByDate(
+                busyIntervals, scheduleStart, scheduleEnd, 30, userZone
+        );
+    }
+
+    @Override
+    public void scheduleMeeting(String userDate, String userTime, String userTimeZone, UserMeetingInfoRequest userMeetingInfoRequest) {
+        String userEmail = userMeetingInfoRequest.getEmail();
+
+        if (userService.getUserHasUsedFreeConsultation(userEmail)) {
+            throw new AccessDeniedException("User has already used free consultation");
+        }
+
+        ZonedDateTime[] expertTimes = meetingUtils.getExpertStartEnd(userDate, userTime, userTimeZone, 30);
+        ZonedDateTime startExpert = expertTimes[0];
+        ZonedDateTime endExpert = expertTimes[1];
+
+        boolean calendarCreated = false;
+        String calendarEventId = null;
+        String meetingLink = null;
+        String meetingId = null;
+
+        try {
+            FreeBusyResponse freeBusy = googleCalendarService.queryFreeBusy(
+                    startExpert.toInstant(),
+                    endExpert.toInstant()
+            );
+            if (!googleCalendarService.isSlotFree(freeBusy, startExpert, endExpert)) {
+                throw new TimeSlotUnavailableException("Slot is no longer available");
+            }
+
+            calendarEventId = googleCalendarService.createEvent(
+                    "Free Consultation",
+                    startExpert.toInstant(),
+                    endExpert.toInstant()
+            );
+            calendarCreated = true;
+
+            String zoomStartTime = startExpert
+                    .withZoneSameInstant(ZoneId.of("UTC"))
+                    .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+            JsonNode jsonNode = zoomService.createMeeting(ZoomMeetingRequest.builder()
+                    .topic("Free Consultation Session")
+                    .startTime(zoomStartTime)
+                    .duration(30)
+                    .timezone(MeetingUtils.EXPERT_ZONE.toString())
+                    .agenda("""
+                        This session is designed to understand your current challenges, goals, and preferences.
+                        During this session, our expert will provide valuable insights based on your situation.
+                        After the session, you will receive a personalized program recommendation tailored to your needs.
+                        """)
+                            .type(2)    // Scheduled meeting
+                    .build());
+            meetingLink = jsonNode.get("join_url").asText();
+            meetingId = jsonNode.get("id").asText();
+
+            emailService.sendFreeConsultationConfirmation(userEmail, userDate, userTime, meetingLink);
+            emailService.sendExpertMeetingInformation(userMeetingInfoRequest, startExpert.toLocalTime().toString(), startExpert.toLocalDate().toString(), userTimeZone, meetingLink);
+
+            LocalDateTime scheduledDayBefore = startExpert
+                    .minusDays(1) // 1 day before
+                    .withHour(8)  // 8 AM
+                    .withMinute(0)
+                    .withSecond(0)
+                    .toLocalDateTime();
+            scheduledEmailService.saveScheduledEmail(
+                    ScheduledEmail.builder()
+                            .recipientEmail(userEmail)
+                            .meetingDateTime(LocalDateTime.parse(userDate + "T" + userTime))
+                            .scheduledDateTime(scheduledDayBefore)
+                            .zoomLink(meetingLink)
+                            .sent(false)
+                            .build()
+            );
+
+            LocalDateTime scheduledOnDay = startExpert.minusHours(2).toLocalDateTime(); // 2 hours before
+            scheduledEmailService.saveScheduledEmail(
+                    ScheduledEmail.builder()
+                            .recipientEmail(userEmail)
+                            .meetingDateTime(LocalDateTime.parse(userDate + "T" + userTime))
+                            .scheduledDateTime(scheduledOnDay)
+                            .zoomLink(meetingLink)
+                            .sent(false)
+                            .build()
+            );
+
+            userService.markUserAsUsedFreeConsultation(userEmail);
+
+        } catch (Exception e) {
+            // Rollback calendar if Zoom or email fails
+            if (calendarCreated && calendarEventId != null) {
+                try {
+                    googleCalendarService.deleteEvent(calendarEventId);
+                } catch (Exception ex) {
+                    // log failure to delete calendar event
+                    System.err.println("Failed to delete calendar event: " + ex.getMessage());
+                }
+            }
+
+            if (meetingId != null) {
+                try {
+                    zoomService.deleteMeeting(meetingId);
+                } catch (Exception ex) {
+                    // log failure to delete Zoom meeting
+                    System.err.println("Failed to delete Zoom meeting: " + ex.getMessage());
+                }
+            }
+
+            // Optionally log or rethrow the exception
+            throw new RuntimeException("Failed to schedule meeting: " + e.getMessage(), e);
+        }
+    }
+
+
+}
Index: ckend/src/main/java/com/shifterwebapp/shifter/meeting/MeetingController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/meeting/MeetingController.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,55 +1,0 @@
-package com.shifterwebapp.shifter.meeting;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.meeting.service.MeetingService;
-import com.shifterwebapp.shifter.user.UserDto;
-import com.shifterwebapp.shifter.user.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/meetings")
-public class MeetingController {
-
-    private final UserService userService;
-    private final MeetingService meetingService;
-    private final Validate validate;
-
-    @GetMapping("/free-time-slots")
-    public ResponseEntity<?> getExpertFreeTimeSlots(
-            @RequestParam String userTimeZone,
-            Authentication authentication
-    ) {
-        validate.validateUserIsAuthenticated(authentication);
-
-        Map<String, List<String>> freeSlots = meetingService.getExpertFreeTimeSlots(userTimeZone);
-        return ResponseEntity.ok(freeSlots);
-    }
-
-    @PostMapping("/schedule-free-consultation")
-    public ResponseEntity<?> scheduleMeeting (
-            @RequestBody UserMeetingInfoRequest userMeetingInfoRequest,
-            @RequestParam String startTime,
-            @RequestParam String userTimeZone,
-            @RequestParam String date,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-        UserDto user = userService.getUserById(userId);
-        userMeetingInfoRequest.setEmail(user.getEmail());
-        userMeetingInfoRequest.setName(user.getName());
-        userMeetingInfoRequest.setCompanyType(user.getCompanyType());
-        userMeetingInfoRequest.setWorkPosition(user.getWorkPosition());
-
-        meetingService.scheduleMeeting(date, startTime, userTimeZone, userMeetingInfoRequest);
-
-
-        return ResponseEntity.ok("Meeting successfully arranged!");
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/meeting/MeetingUtils.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/meeting/MeetingUtils.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,44 +1,0 @@
-package com.shifterwebapp.shifter.meeting;
-import org.springframework.stereotype.Component;
-import java.time.*;
-
-@Component
-public class MeetingUtils {
-
-    public static final ZoneId EXPERT_ZONE = ZoneId.of("Europe/Skopje");
-
-    public ZonedDateTime[] getExpertStartEnd(String date, String time, String userTimeZone, int durationMinutes) {
-        ZoneId userZone = ZoneId.of(userTimeZone);
-
-        LocalDate localDate = LocalDate.parse(date);
-        LocalTime localTime = LocalTime.parse(time);
-        ZonedDateTime startUser = ZonedDateTime.of(localDate, localTime, userZone);
-
-        ZonedDateTime startExpert = startUser.withZoneSameInstant(EXPERT_ZONE);
-        ZonedDateTime endExpert = startExpert.plusMinutes(durationMinutes);
-
-        return new ZonedDateTime[]{startExpert, endExpert};
-    }
-
-    public ZoneId parseZone(String zone) {
-        try {
-            return ZoneId.of(zone);
-        } catch (DateTimeException e) {
-            throw new IllegalArgumentException("Invalid time zone: " + zone, e);
-        }
-    }
-
-    public ZonedDateTime calculateScheduleStart(ZonedDateTime now) {
-        DayOfWeek dow = now.getDayOfWeek();
-        int daysToAdd = switch (dow) {
-            case THURSDAY, FRIDAY -> 4;
-            case SATURDAY -> 3;
-            default -> 2;
-        };
-        return now.withHour(8).withMinute(0).withSecond(0).withNano(0).plusDays(daysToAdd);
-    }
-
-    public ZonedDateTime calculateScheduleEnd(ZonedDateTime start) {
-        return start.withHour(16).withMinute(30).withSecond(0).withNano(0).plusDays(9);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/meeting/UserMeetingInfoRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/meeting/UserMeetingInfoRequest.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package com.shifterwebapp.shifter.meeting;
-
-import com.shifterwebapp.shifter.enums.CompanyType;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class UserMeetingInfoRequest {
-
-    private String name;
-
-    private String email;
-
-    private CompanyType companyType;
-
-    private String workPosition;
-
-    private String aboutCompany;
-
-    private String challenges;
-
-    private String expectations;
-
-    private String otherInfo;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/meeting/ZoomMeetingRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/meeting/ZoomMeetingRequest.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,33 +1,0 @@
-package com.shifterwebapp.shifter.meeting;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Builder
-public class ZoomMeetingRequest {
-
-    @JsonProperty("topic")
-    private String topic;
-
-    @JsonProperty("start_time")
-    private String startTime; // ISO-8601 format: 2025-08-14T15:00:00Z
-
-    @JsonProperty("duration")
-    private int duration; // in minutes
-
-    @JsonProperty("type")
-    private int type; // 2 = scheduled meeting
-
-    @JsonProperty("timezone")
-    private String timezone;
-
-    // Optional
-    @JsonProperty("agenda")
-    private String agenda;
-
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/meeting/service/ImplMeetingService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/meeting/service/ImplMeetingService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.shifterwebapp.shifter.meeting.service;
-
-import com.shifterwebapp.shifter.meeting.UserMeetingInfoRequest;
-
-import java.util.List;
-import java.util.Map;
-
-public interface ImplMeetingService {
-
-    Map<String, List<String>> getExpertFreeTimeSlots(String userTimeZone);
-
-    void scheduleMeeting(String userDate, String userTime, String userTimeZone, UserMeetingInfoRequest userMeetingInfoRequest);
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/meeting/service/MeetingService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/meeting/service/MeetingService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,180 +1,0 @@
-package com.shifterwebapp.shifter.meeting.service;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.api.services.calendar.model.FreeBusyResponse;
-import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.exception.TimeSlotUnavailableException;
-import com.shifterwebapp.shifter.external.email.EmailService;
-import com.shifterwebapp.shifter.external.ZoomService;
-import com.shifterwebapp.shifter.external.GoogleCalendarService;
-import com.shifterwebapp.shifter.meeting.MeetingUtils;
-import com.shifterwebapp.shifter.meeting.UserMeetingInfoRequest;
-import com.shifterwebapp.shifter.meeting.ZoomMeetingRequest;
-import com.shifterwebapp.shifter.scheduledemail.ScheduledEmail;
-import com.shifterwebapp.shifter.scheduledemail.ScheduledEmailService;
-import com.shifterwebapp.shifter.user.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.*;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@RequiredArgsConstructor
-public class MeetingService implements ImplMeetingService {
-
-    private final GoogleCalendarService googleCalendarService;
-    private final ScheduledEmailService scheduledEmailService;
-    private final UserService userService;
-    private final ZoomService zoomService;
-    private final EmailService emailService;
-    private final MeetingUtils meetingUtils;
-
-
-    @Override
-    public Map<String, List<String>> getExpertFreeTimeSlots(String userTimeZone) {
-        ZoneId expertZone = ZoneId.of("Europe/Skopje");
-        ZoneId userZone = meetingUtils.parseZone(userTimeZone);
-
-        ZonedDateTime nowExpert = ZonedDateTime.now(expertZone);
-        ZonedDateTime scheduleStart = meetingUtils.calculateScheduleStart(nowExpert);
-        ZonedDateTime scheduleEnd = meetingUtils.calculateScheduleEnd(scheduleStart);
-
-        FreeBusyResponse freeBusyResponse = googleCalendarService
-                .queryFreeBusy(scheduleStart.toInstant(), scheduleEnd.toInstant());
-
-        String calendarId = googleCalendarService.getExpertCalendarId();
-        if (freeBusyResponse == null
-                || freeBusyResponse.getCalendars() == null
-                || freeBusyResponse.getCalendars().get(calendarId) == null
-                || freeBusyResponse.getCalendars().get(calendarId).getBusy() == null) {
-            throw new IllegalStateException("Invalid FreeBusyResponse from Google API");
-        }
-
-        List<GoogleCalendarService.TimeInterval> busyIntervals = freeBusyResponse
-                .getCalendars()
-                .get(calendarId)
-                .getBusy()
-                .stream()
-                .map(i -> new GoogleCalendarService.TimeInterval(
-                        Instant.ofEpochMilli(i.getStart().getValue()),
-                        Instant.ofEpochMilli(i.getEnd().getValue())))
-                .toList();
-
-        return googleCalendarService.computeFreeSlotsByDate(
-                busyIntervals, scheduleStart, scheduleEnd, 30, userZone
-        );
-    }
-
-    @Override
-    public void scheduleMeeting(String userDate, String userTime, String userTimeZone, UserMeetingInfoRequest userMeetingInfoRequest) {
-        String userEmail = userMeetingInfoRequest.getEmail();
-
-        if (userService.getUserHasUsedFreeConsultation(userEmail)) {
-            throw new AccessDeniedException("User has already used free consultation");
-        }
-
-        ZonedDateTime[] expertTimes = meetingUtils.getExpertStartEnd(userDate, userTime, userTimeZone, 30);
-        ZonedDateTime startExpert = expertTimes[0];
-        ZonedDateTime endExpert = expertTimes[1];
-
-        boolean calendarCreated = false;
-        String calendarEventId = null;
-        String meetingLink = null;
-        String meetingId = null;
-
-        try {
-            FreeBusyResponse freeBusy = googleCalendarService.queryFreeBusy(
-                    startExpert.toInstant(),
-                    endExpert.toInstant()
-            );
-            if (!googleCalendarService.isSlotFree(freeBusy, startExpert, endExpert)) {
-                throw new TimeSlotUnavailableException("Slot is no longer available");
-            }
-
-            calendarEventId = googleCalendarService.createEvent(
-                    "Free Consultation",
-                    startExpert.toInstant(),
-                    endExpert.toInstant()
-            );
-            calendarCreated = true;
-
-            String zoomStartTime = startExpert
-                    .withZoneSameInstant(ZoneId.of("UTC"))
-                    .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
-            JsonNode jsonNode = zoomService.createMeeting(ZoomMeetingRequest.builder()
-                    .topic("Free Consultation Session")
-                    .startTime(zoomStartTime)
-                    .duration(30)
-                    .timezone(MeetingUtils.EXPERT_ZONE.toString())
-                    .agenda("""
-                        This session is designed to understand your current challenges, goals, and preferences.
-                        During this session, our expert will provide valuable insights based on your situation.
-                        After the session, you will receive a personalized program recommendation tailored to your needs.
-                        """)
-                            .type(2)    // Scheduled meeting
-                    .build());
-            meetingLink = jsonNode.get("join_url").asText();
-            meetingId = jsonNode.get("id").asText();
-
-            emailService.sendFreeConsultationConfirmation(userEmail, userDate, userTime, meetingLink);
-            emailService.sendExpertMeetingInformation(userMeetingInfoRequest, startExpert.toLocalTime().toString(), startExpert.toLocalDate().toString(), userTimeZone, meetingLink);
-
-            LocalDateTime scheduledDayBefore = startExpert
-                    .minusDays(1) // 1 day before
-                    .withHour(8)  // 8 AM
-                    .withMinute(0)
-                    .withSecond(0)
-                    .toLocalDateTime();
-            scheduledEmailService.saveScheduledEmail(
-                    ScheduledEmail.builder()
-                            .recipientEmail(userEmail)
-                            .meetingDateTime(LocalDateTime.parse(userDate + "T" + userTime))
-                            .scheduledDateTime(scheduledDayBefore)
-                            .zoomLink(meetingLink)
-                            .sent(false)
-                            .build()
-            );
-
-            LocalDateTime scheduledOnDay = startExpert.minusHours(2).toLocalDateTime(); // 2 hours before
-            scheduledEmailService.saveScheduledEmail(
-                    ScheduledEmail.builder()
-                            .recipientEmail(userEmail)
-                            .meetingDateTime(LocalDateTime.parse(userDate + "T" + userTime))
-                            .scheduledDateTime(scheduledOnDay)
-                            .zoomLink(meetingLink)
-                            .sent(false)
-                            .build()
-            );
-
-            userService.markUserAsUsedFreeConsultation(userEmail);
-
-        } catch (Exception e) {
-            // Rollback calendar if Zoom or email fails
-            if (calendarCreated && calendarEventId != null) {
-                try {
-                    googleCalendarService.deleteEvent(calendarEventId);
-                } catch (Exception ex) {
-                    // log failure to delete calendar event
-                    System.err.println("Failed to delete calendar event: " + ex.getMessage());
-                }
-            }
-
-            if (meetingId != null) {
-                try {
-                    zoomService.deleteMeeting(meetingId);
-                } catch (Exception ex) {
-                    // log failure to delete Zoom meeting
-                    System.err.println("Failed to delete Zoom meeting: " + ex.getMessage());
-                }
-            }
-
-            // Optionally log or rethrow the exception
-            throw new RuntimeException("Failed to schedule meeting: " + e.getMessage(), e);
-        }
-    }
-
-
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -8,4 +8,5 @@
 import lombok.*;
 
+import java.time.LocalDate;
 import java.util.Date;
 
@@ -23,5 +24,5 @@
     private Double amount;
 
-    private Date date;
+    private LocalDate date;
 
     @Enumerated(EnumType.STRING)
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -7,4 +7,5 @@
 import lombok.NoArgsConstructor;
 
+import java.time.LocalDate;
 import java.util.Date;
 
@@ -18,5 +19,5 @@
     private Double amount;
 
-    private Date date;
+    private LocalDate date;
 
     private PaymentMethod paymentMethod;
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -17,4 +17,5 @@
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
@@ -80,5 +81,5 @@
         Payment payment = Payment.builder()
                 .amount(course.getPrice())
-                .date(new Date())
+                .date(LocalDate.now())
                 .paymentMethod(paymentMethod)
                 .paymentStatus(PaymentStatus.COMPLETED)
Index: backend/src/main/java/com/shifterwebapp/shifter/review/Review.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/Review.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/Review.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -5,4 +5,5 @@
 import lombok.*;
 
+import java.time.LocalDate;
 import java.util.Date;
 
@@ -22,7 +23,5 @@
     private String comment;
 
-    private Boolean canBeUsedAsTestimonial;
-
-    private Date date;
+    private LocalDate review_date;
 
     @OneToOne
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,7 +1,12 @@
 package com.shifterwebapp.shifter.review;
 
+import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.review.service.ReviewService;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
 import org.springframework.web.bind.annotation.*;
 
@@ -14,4 +19,5 @@
 
     private final ReviewService reviewService;
+    private final Validate validate;
 
     @GetMapping("/{reviewId}")
@@ -21,24 +27,52 @@
     }
 
-    @GetMapping("/{courseId}")
-    public ResponseEntity<List<ReviewDto>> getReviewByCourse(@PathVariable Long courseId) {
-        List<ReviewDto> reviewDtos = reviewService.getReviewsByCourse(courseId);
+    @GetMapping("/course/{courseId}")
+    public ResponseEntity<ReviewDto> getReviewByCourse(
+            @PathVariable Long courseId,
+            Authentication authentication
+    ) {
+        Long userId = validate.extractUserId(authentication);
+        ReviewDto reviewDtos = reviewService.getReviewByUserAndCourse(userId, courseId);
         return ResponseEntity.ok(reviewDtos);
     }
 
-    @GetMapping("/{userId}")
-    public ResponseEntity<List<ReviewDto>> getReviewByuser(@PathVariable Long userId) {
+    @GetMapping("/user/{userId}")
+    public ResponseEntity<List<ReviewDto>> getReviewByUser(@PathVariable Long userId) {
         List<ReviewDto> reviewDtos = reviewService.getReviewsByUser(userId);
         return ResponseEntity.ok(reviewDtos);
     }
 
-    @PostMapping
-    public ResponseEntity<?> writeReview(@RequestParam Long enrollmentId, @RequestBody ReviewDto reviewDto) {
-        try {
-            ReviewDto savedReviewDto = reviewService.writeReview(enrollmentId, reviewDto);
-            return ResponseEntity.ok(savedReviewDto);
-        } catch (Exception e) {
-            return ResponseEntity.badRequest().body(e.getMessage());
-        }
+    @PostMapping("/{courseId}")
+    public ResponseEntity<?> writeReview(
+            @PathVariable Long courseId,
+            @RequestBody ReviewRequest reviewRequest,
+            Authentication authentication
+    ) {
+        Long userId = validate.extractUserId(authentication);
+
+        reviewService.writeReview(
+                userId,
+                courseId,
+                reviewRequest
+        );
+
+        return ResponseEntity.ok("Successfully created review");
+    }
+
+    @PutMapping("/{courseId}")
+    public ResponseEntity<?> updateReview(
+            @PathVariable Long courseId,
+            @RequestBody ReviewRequest reviewRequest,
+            Authentication authentication
+    ) {
+        Long userId = validate.extractUserId(authentication);
+
+        reviewService.updateReview(
+                userId,
+                courseId,
+                reviewRequest
+        );
+
+        return ResponseEntity.ok("Successfully created review");
     }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewDto.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewDto.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -5,4 +5,5 @@
 import lombok.NoArgsConstructor;
 
+import java.time.LocalDate;
 import java.util.Date;
 
@@ -18,7 +19,5 @@
     private String comment;
 
-    private Boolean canBeUsedAsTestimonial;
-
-    private Date date;
+    private LocalDate date;
 
     private Integer enrollmentId;
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -6,4 +6,5 @@
 
 import java.util.List;
+import java.util.Optional;
 
 public interface ReviewRepository extends JpaRepository<Review, Long> {
@@ -18,4 +19,11 @@
     List<Review> findReviewsByUser(@Param("userId") Long userId);
 
+    @Query("select r from Review r where r.enrollment.payment.user.id = :userId and r.enrollment.course.id = :courseId")
+    Optional<Review> findReviewByUserAndCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
+
+
+    @Query("select r from Review r where r.enrollment.id = :enrollmentId")
+    Review findReviewByEnrollment(Long enrollmentId);
+
     @Query("select case when count(r) > 0 then true else false end" +
             " from Review r where r.enrollment.payment.user.id = :userId and r.enrollment.course.id = :userId")
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRequest.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRequest.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,13 @@
+package com.shifterwebapp.shifter.review;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ReviewRequest {
+    private Integer rating;
+    private String comment;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -2,4 +2,5 @@
 
 import com.shifterwebapp.shifter.review.ReviewDto;
+import com.shifterwebapp.shifter.review.ReviewRequest;
 
 import java.util.List;
@@ -9,7 +10,11 @@
     List<ReviewDto> getReviewsByCourse(Long courseId);
     List<ReviewDto> getReviewsByUser(Long userId);
+    ReviewDto getReviewByUserAndCourse(Long userId, Long courseId);
+    ReviewDto getReviewByEnrollment(Long enrollmentId);
     Double getAverageRatingByCourse(Long courseId);
 
-    ReviewDto writeReview(Long enrollmentId, ReviewDto reviewDto);
+    ReviewDto writeReview(Long userId, Long courseId, ReviewRequest reviewRequest);
+
+    ReviewDto updateReview(Long userId, Long courseId, ReviewRequest reviewRequest);
 
     Boolean hasBeenReviewedByUser(Long userId, Long courseId);
Index: backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -4,15 +4,14 @@
 import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
 import com.shifterwebapp.shifter.enums.EnrollmentStatus;
+import com.shifterwebapp.shifter.exception.AccessDeniedException;
 import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
-import com.shifterwebapp.shifter.review.Review;
-import com.shifterwebapp.shifter.review.ReviewDto;
-import com.shifterwebapp.shifter.review.ReviewMapper;
-import com.shifterwebapp.shifter.review.ReviewRepository;
+import com.shifterwebapp.shifter.review.*;
 import com.shifterwebapp.shifter.Validate;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
+import java.time.LocalDate;
 import java.util.List;
+import java.util.Optional;
 
 @Service
@@ -46,4 +45,23 @@
 
     @Override
+    public ReviewDto getReviewByUserAndCourse(Long userId, Long courseId) {
+        validate.validateCourseExists(courseId);
+        validate.validateUserExists(userId);
+        Optional<Review> reviewOpt = reviewRepository.findReviewByUserAndCourse(userId, courseId);
+        if (reviewOpt.isEmpty()) {
+            throw new ResourceNotFoundException("Review not found for user with ID " + userId + " and course with ID " + courseId);
+        }
+        Review review = reviewOpt.get();
+        return reviewMapper.toDto(review);
+    }
+
+    @Override
+    public ReviewDto getReviewByEnrollment(Long enrollmentId) {
+        validate.validateEnrollmentExists(enrollmentId);
+        Review review = reviewRepository.findReviewByEnrollment(enrollmentId);
+        return reviewMapper.toDto(review);
+    }
+
+    @Override
     public Double getAverageRatingByCourse(Long courseId) {
         validate.validateCourseExists(courseId);
@@ -53,22 +71,43 @@
 
     @Override
-    public ReviewDto writeReview(Long enrollmentId, ReviewDto reviewDto) {
-        validate.validateEnrollmentExists(enrollmentId);
+    public ReviewDto writeReview(Long userId, Long courseId, ReviewRequest reviewRequest) {
+        validate.validateCourseExists(courseId);
 
-        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
+        Enrollment enrollment = enrollmentRepository.findEnrollmentByUserAndCourse(userId, courseId);
         if (enrollment.getReview() != null) {
-            throw new RuntimeException("Review already submitted for enrollment with ID " + enrollmentId + "!");
+            throw new IllegalStateException("Review already submitted for course with ID " + courseId + "!");
         }
         if (enrollment.getEnrollmentStatus() != EnrollmentStatus.COMPLETED) {
-            throw new RuntimeException("Cannot review a course that has not been completed by user!");
+            throw new AccessDeniedException("Cannot review a course that has not been completed by user!");
         }
 
         Review review = Review.builder()
-                .rating(reviewDto.getRating())
-                .comment(reviewDto.getComment())
-                .canBeUsedAsTestimonial(reviewDto.getCanBeUsedAsTestimonial())
+                .rating(reviewRequest.getRating())
+                .comment(reviewRequest.getComment())
                 .enrollment(enrollment)
-                .date(new Date())
+                .review_date(LocalDate.now())
                 .build();
+
+        reviewRepository.save(review);
+
+        return reviewMapper.toDto(review);
+    }
+
+    @Override
+    public ReviewDto updateReview(Long userId, Long courseId, ReviewRequest reviewRequest) {
+        validate.validateCourseExists(courseId);
+
+        Enrollment enrollment = enrollmentRepository.findEnrollmentByUserAndCourse(userId, courseId);
+        if (enrollment.getReview() == null) {
+            throw new IllegalStateException("Review hasn't been submitted for course with ID " + courseId + " so that it can be updated!");
+        }
+        if (enrollment.getEnrollmentStatus() != EnrollmentStatus.COMPLETED) {
+            throw new AccessDeniedException("Cannot review a course that has not been completed by user!");
+        }
+
+        Review review = reviewRepository.findReviewByEnrollment(enrollment.getId());
+        review.setRating(reviewRequest.getRating());
+        review.setComment(reviewRequest.getComment());
+        review.setReview_date(LocalDate.now());
 
         reviewRepository.save(review);
Index: backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourse.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourse.sql	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourse.sql	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -7,6 +7,4 @@
                     duration_minutes,
                     price,
-                    rating,
-                    rating_count,
                     image_url,
                     color)
@@ -16,5 +14,5 @@
         'Explore how paradigms shape your thinking, and how perception and perspective impact your professional and personal growth. In this course, you’ll uncover why shifting these mental models is crucial for unlocking new opportunities and overcoming hidden barriers. You’ll also learn how to use these concepts to build a resilient foundation that supports confident decision-making and continuous improvement in business and career contexts.',
         'This comprehensive course deeply explores the powerful concepts of paradigms, perception, and perspective as they relate to business and professional growth. You''ll gain a thorough understanding of what paradigms are — deeply ingrained mental frameworks that shape how you interpret and interact with the world around you. You''ll learn how perception (your interpretation of external events) and perspective (your angle or approach) are interconnected and influence every decision and action you take. We examine common pitfalls that professionals encounter when they hold rigid paradigms or outdated perspectives, preventing them from adapting to change and seizing opportunities. Through practical exercises, real-life case studies, and reflective assessments, you''ll learn how to identify and reframe limiting paradigms to adopt a growth-oriented mindset that supports continuous improvement. You''ll explore advanced strategies to strengthen self-awareness and emotional intelligence, crucial skills for leadership and personal development. Additionally, we delve into subtle but critical differences between perception and perspective and how misalignment can undermine even the most skilled professionals. By the end of this course, you''ll have a robust framework for self-assessment and practical tools to shift your mental models, enhance decision-making, and achieve sustainable success in your business and career.',
-        'BEGINNER', 221, 0, 47, 10,
+        'BEGINNER', 221, 0,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751286550/Foundations_for_a_Successful_Business_Career_k8vcuu.jpg',
         '#02C2FF'),
@@ -25,5 +23,5 @@
         'Learn how to shift from simply managing tasks to truly leading with purpose and clarity. In this course, you will explore leadership mindsets, communication strategies, and practical tools to empower your team, foster accountability, and create a motivating environment. You will also understand how to balance responsibility and delegation while cultivating a strong culture of trust and performance within your organization.',
         'This course is designed for managers who aspire to become impactful leaders capable of driving both people and processes to success. You''ll learn about generative leadership and the 3xH''s model (Head, Heart, and Hands), which helps leaders balance logic, emotion, and action. Discover the fundamental differences between responsibility and guilt, and how to build a strong foundation for team accountability. The course covers vital communication strategies, effective feedback methods, and advanced delegation skills, ensuring that you empower rather than micromanage your team. You''ll explore leadership models like AB, Min/Max, and SMART objectives to clarify goals and expectations. Practical scenarios and real-world case studies will help you understand common challenges faced by managers as they step into leadership roles, including breaking organizational silos and fostering cross-functional collaboration. Additionally, you will learn how to mentor and develop future leaders, cultivate a culture of trust and innovation, and handle difficult conversations with grace. By the end, you''ll possess a complete toolkit to inspire, guide, and lead with confidence and authenticity, making you a true catalyst for organizational success.',
-        'INTERMEDIATE', 242, 29, 48, 10,
+        'INTERMEDIATE', 242, 29,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/From_Manager_to_Leader_-_Empowering_People_Managing_Processes_vgoyoh.webp',
         '#19C6D6'),
@@ -34,5 +32,5 @@
         'Master a detailed, step-by-step framework designed to guide your business through structured, sustainable transformation. In this course, you will learn how to align teams around a clear purpose, engage middle management, establish effective KPIs, and implement change initiatives that ensure long-term resilience and growth. Discover how to create agile structures and overcome resistance to change with confidence.',
         'This course serves as a complete roadmap for leaders and strategists who want to guide their organizations through impactful, sustainable transformation. You will learn how to recognize when transformation is necessary, understand its drivers, and define a clear purpose and direction. The program unpacks the six essential stages of transformation: from establishing a powerful purpose to developing robust KPIs that measure progress and success. You''ll explore the pivotal role middle management plays as both champions and gatekeepers of change, and how to effectively engage them in the process. Through detailed exploration of each transformation stage, you will understand the importance of sequential execution to avoid chaos and resistance. The course also emphasizes building agile and resilient organizational structures that can adapt to market changes while maintaining long-term stability and sustainability. Real-world examples and case studies provide insights into overcoming common pitfalls, such as stakeholder misalignment and cultural resistance. By integrating new paradigms and perspectives, you''ll empower your business to achieve unmatched levels of stability, agility, resilience, and sustainability. By the end, you''ll have the strategic and operational tools to design and execute transformative initiatives that create enduring business success.',
-        'ADVANCED', 239, 54, 49, 10,
+        'ADVANCED', 239, 54,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Business_Transformation_Blueprint_-_Crafting_the_Path_to_Success_aimssk.jpg',
         '#1FB0C3'),
@@ -43,5 +41,5 @@
         'Gain a practical, step-by-step approach to building strong business foundations for your SME. This course helps you navigate information overload, focus on what truly matters, and set up systems that promote stability, agility, and sustainable growth. You will also learn how to align your team around a shared vision and build long-term strategies that empower you to grow confidently and strategically.',
         'In today''s information-saturated world, small and medium-sized enterprises often face an overwhelming number of business growth strategies, marketing advice, and conflicting success frameworks. This course is designed to eliminate that confusion and provide a structured, practical approach to building a solid business foundation. You''ll learn how to clearly define your purpose, align your team, and develop a strategic plan that ensures long-term success. The course introduces a new paradigm and expanded perspective to help you focus on what truly matters for sustainable growth. You''ll explore how to achieve stability, agility, resilience, and sustainability by applying tried-and-tested models and frameworks tailored for SMEs. Detailed modules will guide you through core business functions including operations, sales, marketing, finance, and HR, ensuring every area supports your overall strategic vision. You will also learn how to evaluate and improve organizational efficiency, establish clear KPIs, and build a culture of continuous improvement. Real-world case studies and hands-on exercises will help solidify these concepts, empowering you to navigate uncertainty with clarity and confidence. By the end, you''ll have a complete step-by-step guide to transform your SME into a thriving, future-proof business.',
-        'INTERMEDIATE', 165, 50, 49, 10,
+        'INTERMEDIATE', 165, 50,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Business_Roadmap_for_SME_s_-_A_Step-by-Step_Guide_for_Establishing_Core_Business_Foundations_for_Sustainable_Growth_qeejox.jpg',
         '#002E5D'),
@@ -52,5 +50,5 @@
         'Unlock a comprehensive roadmap to mastering modern sales processes, leadership, and communication. You will learn advanced techniques to build high-performance sales teams, foster synergy, improve negotiation outcomes, and cultivate a growth-focused mindset. This course empowers you to close deals confidently, inspire your team, and consistently exceed sales targets in a rapidly changing market.',
         'This comprehensive sales masterclass is designed for professionals who want to stand out and excel in today''s dynamic and client-centric market. You''ll gain in-depth insights into the roles of frontline salespeople and sales leaders, understanding how to create synergy and high-performance teams. Learn the critical difference between being responsible and feeling guilty and how this affects your sales mindset and resilience. Explore how organizational silos negatively impact sales efficiency and how to overcome them to foster seamless collaboration. You''ll study advanced time management techniques tailored for sales environments, and understand what truly defines high-performance behaviors and results. The course covers essential negotiation strategies, modern communication techniques, and practical leadership tools like the AB model, helping you build stronger client relationships and close deals with greater success. Through practical examples, exercises, and case studies, you''ll develop a powerful mix of technical skills and soft skills necessary for outstanding sales performance. By the end of the course, you will have the confidence, strategic understanding, and practical tools to lead in sales, exceed targets consistently, and build a long-lasting, client-centered career.',
-        'ADVANCED', 240, 29, 47, 10,
+        'ADVANCED', 240, 29,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Sales_Masterclass_-_Leadership_Communication_and_Modern_Sales_Process_v74qdh.webp',
         '#034D4C'),
@@ -61,5 +59,5 @@
         'Develop essential skills to move from being good to truly extraordinary in your personal and professional life. In this course, you’ll explore powerful frameworks for time management, decision-making, and expectation management, as well as cognitive and behavioral tools that enhance overall effectiveness. Learn how to create impactful habits, improve communication, and unlock new levels of personal growth and achievement.',
         'This holistic course is designed for individuals and professionals who want to elevate their effectiveness, mindset, and results. You''ll explore essential topics such as perception, time management, managing expectations, and setting smart priorities. Through practical frameworks like the AB model, Min/Max analysis, SMART objectives, and the method of deduction, you''ll learn to improve decision-making, enhance efficiency, and boost overall performance. The course also emphasizes cognitive skills development, communication maturity, and how to handle high-pressure situations with confidence. You''ll master meeting productivity, strategic thinking, and personal effectiveness in real-world scenarios. By engaging in reflective exercises and practical activities, you''ll uncover hidden habits that limit your potential and replace them with proactive, empowering behaviors. Real-world case studies and success stories illustrate how these skills can transform your professional journey from merely good to truly extraordinary. By the end of this course, you will possess a robust toolkit for achieving outstanding results, strengthening relationships, and continuously advancing both personally and professionally.',
-        'INTERMEDIATE', 197, 35, 48, 10,
+        'INTERMEDIATE', 197, 35,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751032528/From_Good_to_Extraordinary_-_Mastering_Skills_for_Success_fm0io9.webp',
         '#D0B8A3'),
@@ -70,5 +68,5 @@
         'Learn to build a clear and highly effective go-to-market strategy in three actionable steps. You will discover how to identify and understand your ideal client profile, define precise messaging, and choose the best channels to reach them. By applying practical tools and real-world examples, you’ll gain the confidence and clarity needed to succeed in even the most competitive markets.',
         'Without a clear marketing strategy, businesses often drift without focus and waste resources. This course introduces a straightforward, three-step approach to creating a highly effective go-to-market strategy. You will learn how to define your ideal target client using eight key characteristics: needs, wants, expectations, challenges, fears, intentions, prejudices, and opportunities. Next, you will master how to determine the right timing, channels, and messaging to reach and engage your audience most effectively. The course includes strategic tools like the AB model and a quantitative negotiation method, enabling you to make data-driven and confident decisions. You will also explore how to build strong value propositions and design a compelling customer journey that increases conversion and loyalty. Real-world case studies and practical exercises will help you directly apply these concepts to your business. By the end of this course, you will have a clear, actionable, and winning strategy that strengthens market positioning, drives revenue, and supports long-term growth.',
-        'INTERMEDIATE', 206, 29, 49, 10,
+        'INTERMEDIATE', 206, 29,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Winning_Markets_in_3_Steps_-_Building_a_Clear_Go-to-Market_Strategy_vayg15.png',
         '#FF6F61'),
@@ -79,5 +77,5 @@
         'Learn how to move beyond selling services and start offering impactful solutions and strategic concepts that create true value for your clients. This course helps you understand your clients'' real needs, develop offers that solve deeper problems, and position yourself as a trusted strategic partner. Gain the skills to design solutions that resonate and drive long-term business relationships.',
         'In this course, you will learn how to move beyond selling services to providing impactful solutions and long-term concepts that generate true value. You will understand the critical differences between selling a service, providing a solution, and developing a concept — and why moving to solutions and concepts unlocks higher client loyalty and market differentiation. You will learn to deeply analyze your target audience, identify real problems they face, and design solutions that directly address those needs. The course covers techniques for developing strong value propositions, strategic storytelling, and crafting offers that resonate with clients on both functional and emotional levels. Using practical examples, including the iconic Nescafe Frape concept, you will see how theory transforms into actionable business models. You will also explore frameworks to ensure your solutions are scalable and sustainable, and how to create offers that position you as a strategic partner rather than just a service provider. By the end of this course, you will have a clear roadmap to build offers that inspire, engage, and create lasting value for your clients and your business.',
-        'INTERMEDIATE', 203, 29, 49, 10,
+        'INTERMEDIATE', 203, 29,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Creating_Added_Value_-_How_to_Offer_SolutionsConcepts_Instead_of_Services_z9fs3c.png',
         '#F5AD01'),
@@ -88,5 +86,5 @@
         'Discover how to design an onboarding experience that helps new employees integrate quickly and successfully into your organization. You’ll learn to create a structured onboarding plan that enhances engagement, clarifies expectations, and improves long-term retention. This course provides practical strategies and tools to ensure new hires feel confident, motivated, and fully prepared to contribute from day one.',
         'Effective onboarding is essential for ensuring new employees feel confident, welcomed, and prepared to succeed. This course covers how to build a structured onboarding journey that integrates new hires smoothly into your company culture and operational workflow. You will learn to design clear role expectations, create pre-boarding materials, and organize first-week activities that build strong initial connections. The course also provides strategies for extending onboarding beyond the first weeks to reinforce learning, encourage engagement, and foster long-term retention. You will explore templates and feedback loops that help continuously improve the onboarding process. By using real-world examples and practical exercises, you will be able to avoid common pitfalls that lead to disengagement and turnover. By the end, you will have the skills and resources to design a seamless onboarding experience that strengthens employee satisfaction, boosts retention, and supports overall organizational success.',
-        'BEGINNER', 141, 25, 48, 10,
+        'BEGINNER', 141, 25,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Onboarding_Fundamentals_-_How_to_Successfully_Incorporate_New_Employees_bksbad.png',
         '#008CC2'),
@@ -97,5 +95,5 @@
         'Unlock your growth potential by learning to evaluate your strengths and weaknesses using proven self-assessment methods. This course guides you through frameworks for understanding what holds you back, helps you set actionable improvement goals, and empowers you to create a roadmap for professional and personal development. Gain clarity and build the confidence needed to achieve sustained growth.',
         'This course provides a step-by-step approach to understanding and improving your professional effectiveness. You will explore self-assessment techniques such as performance evaluations, needs analysis, and the method of deduction to uncover hidden patterns in your behavior and mindset. The course emphasizes practical applications that help you turn self-reflection into actionable growth strategies. You will learn how to identify barriers holding you back, develop clear action plans to overcome them, and set measurable goals for continuous improvement. Additionally, you will explore the importance of seeking feedback from peers and mentors to enhance self-awareness and accountability. Through exercises, case studies, and personal reflection, you will gain the tools to improve decision-making, boost confidence, and advance your career more strategically. By the end of the course, you will have a comprehensive self-development roadmap, empowering you to achieve personal and professional breakthroughs and realize your full potential.',
-        'BEGINNER', 154, 25, 47, 10,
+        'BEGINNER', 154, 25,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Professional_Self-Assessment_-_Identify_Barriers_Holding_You_Back_Areas_for_Improvement_tiyydc.jpg',
         '#CC6232'),
@@ -106,5 +104,5 @@
         'Discover how to embed operational excellence and continuous improvement deeply into your organization. Learn to align teams, set impactful goals, streamline communication, and create systems that support high performance and growth. This course equips you with practical models and real-world strategies to build a culture of excellence that drives long-term competitive advantage.',
         'This course is designed to help leaders and professionals embed a culture of excellence and continuous improvement across their organizations. You will explore powerful models including the Effective Meetings Model, AB model, DF model, and pre/post evaluation frameworks to improve alignment and accountability. The course guides you through mapping organizational disproportions, streamlining communication, and fostering cross-functional collaboration. You will learn to set clear goals, establish robust KPIs, and create feedback loops that reinforce progress and drive sustained success. Real-world examples and case studies show how to navigate resistance to change and build momentum for new initiatives. You will also develop strategies for ensuring long-term adoption of excellence practices and integrating them into the daily rhythm of the organization. By the end of the course, you will possess the mindset, frameworks, and tools needed to transform your organization into a resilient, agile, and continuously improving enterprise, capable of maintaining a competitive edge in any market.',
-        'ADVANCED', 161, 39, 49, 10,
+        'ADVANCED', 161, 39,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028998/Establishing_Continuous_Business_Excellence_in_Your_Company_g3yvao.png',
         '#18898D'),
@@ -115,5 +113,5 @@
         'Learn to build strong, structured teams and efficient systems that drive organizational success and growth. This course teaches you how to break down silos, improve collaboration, clarify team roles, and establish accountability structures. Gain the skills to design organizational systems that promote agility, optimize performance, and create a foundation for long-term sustainability and resilience.',
         'This course provides a comprehensive guide to creating high-performing teams and building structured systems that drive organizational success. You will learn how to develop systematic approaches to team design, clarify roles and responsibilities, and eliminate inefficiencies caused by miscommunication and silos. The course covers essential practices for aligning teams with organizational goals, improving collaboration, and establishing strong accountability mechanisms. You will also explore frameworks for effective meetings, conflict resolution, and strategic decision-making that help maintain cohesion and high performance. Using practical exercises and case studies, you will learn to diagnose structural bottlenecks and design solutions that enable scalability and agility. By the end, you will have the knowledge and skills to build robust organizational structures that support continuous improvement, empower teams to excel, and sustain competitive advantage in a dynamic business environment.',
-        'INTERMEDIATE', 165, 32, 48, 10,
+        'INTERMEDIATE', 165, 32,
         'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/High-Performing_Teams_and_Systems_-_Organizational_Success_Through_Structure_b6jvm5.jpg',
         '#FF9503');
Index: backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourseContent.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourseContent.sql	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourseContent.sql	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -7,5 +7,5 @@
     ('Transforming Mindsets for Growth', 3, 1);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Understanding Paradigms & Mental Frameworks (course_content_id: 1)
@@ -62,5 +62,5 @@
     ('Navigating Organizational Change', 4, 2);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Leadership Mindsets & Models (course_content_id: 4)
@@ -123,5 +123,5 @@
     ('Building Agile & Resilient Organizations', 4, 3);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Foundations of Business Transformation (course_content_id: 8)
@@ -180,5 +180,5 @@
     ('Building Sustainable Growth Systems', 3, 4);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Core Foundations for SME Success (course_content_id: 12)
@@ -226,5 +226,5 @@
     ('Negotiation & Client Relationships', 4, 5);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Sales Leadership Fundamentals (course_content_id: 15)
@@ -284,5 +284,5 @@
     ('Transforming Good Habits into Extraordinary Results', 4, 6);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Foundations of Effective Skill-Building (course_content_id: 19)
@@ -336,5 +336,5 @@
     ('Integrating Strategy into Execution', 4, 7);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Defining Your Ideal Client Profile (course_content_id: 23)
@@ -388,5 +388,5 @@
     ('Positioning Yourself as a Strategic Partner', 4, 8);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Understanding Client Problems Deeply (course_content_id: 27)
@@ -436,5 +436,5 @@
     ('Long-Term Integration and Development', 3, 9);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Pre-Onboarding Preparation (course_content_id: 31)
@@ -475,5 +475,5 @@
     ('Implementing Continuous Self-Improvement', 3, 10);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Identifying Personal Barriers (course_content_id: 34)
@@ -514,5 +514,5 @@
     ('Embedding a High-Performance Culture', 3, 11);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Laying the Foundations of Excellence (course_content_id: 37)
@@ -553,5 +553,5 @@
     ('Maintaining Long-Term Performance', 3, 12);
 
-INSERT INTO course_lecture (content_text, content_type, content_url, description, duration_minutes, position, title, course_content_id)
+INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
 VALUES
     -- Building Effective Team Structures (course_content_id: 40)
Index: backend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -5,5 +5,5 @@
                    points,
                    work_position,
-                   company_type)
+                   company_size)
 VALUES (
         'admin@gmail.com',
Index: backend/src/main/java/com/shifterwebapp/shifter/user/User.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -2,6 +2,6 @@
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.shifterwebapp.shifter.enums.CompanySize;
 import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.enums.CompanyType;
 import jakarta.persistence.*;
 import lombok.*;
@@ -39,5 +39,5 @@
 
     @Enumerated(EnumType.STRING)
-    private CompanyType companyType;
+    private CompanySize companySize;
     
     private String workPosition;
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,6 +1,5 @@
 package com.shifterwebapp.shifter.user;
 
-import com.shifterwebapp.shifter.payment.PaymentDto;
-import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.CompanySize;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -22,5 +21,5 @@
     private Boolean hasUsedFreeConsultation;
 
-    private CompanyType companyType;
+    private CompanySize companySize;
 
     private String workPosition;
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserInfoDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserInfoDto.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserInfoDto.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,5 +1,5 @@
 package com.shifterwebapp.shifter.user;
 
-import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.CompanySize;
 import lombok.Data;
 
@@ -9,5 +9,5 @@
     public String name;
     public String workPosition;
-    private CompanyType companyType;
+    private CompanySize companySize;
 
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -76,5 +76,5 @@
                 .isAdmin(false)
                 .hasUsedFreeConsultation(false)
-                .companyType(registerDto.getCompanyType())
+                .companySize(registerDto.getCompanySize())
                 .workPosition(registerDto.getWorkPosition())
                 .interests(registerDto.getInterests())
@@ -102,6 +102,6 @@
             user.setName(userInfoDto.getName());
         }
-        if (userInfoDto.getCompanyType() != null) {
-            user.setCompanyType(userInfoDto.getCompanyType());
+        if (userInfoDto.getCompanySize() != null) {
+            user.setCompanySize(userInfoDto.getCompanySize());
         }
         if (userInfoDto.getWorkPosition() != null) {
Index: backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressController.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -2,4 +2,5 @@
 
 import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
 import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
 import lombok.RequiredArgsConstructor;
@@ -23,7 +24,7 @@
         Long userId = validate.extractUserId(authentication);
 
-        UserCourseProgressDto userCourseProgressDto = userCourseProgressService.completeUserCourseProgress(progressId, userId);
+        userCourseProgressService.completeUserCourseProgress(progressId, userId);
 
-        return ResponseEntity.ok(userCourseProgressDto);
+        return ResponseEntity.ok("Successfully completed progress with ID: " + progressId + " for user with ID: " + userId);
     }
 
@@ -35,7 +36,7 @@
         Long userId = validate.extractUserId(authentication);
 
-        UserCourseProgressDto userCourseProgressDto = userCourseProgressService.uncompleteUserCourseProgress(progressId, userId);
+        userCourseProgressService.uncompleteUserCourseProgress(progressId, userId);
 
-        return ResponseEntity.ok(userCourseProgressDto);
+        return ResponseEntity.ok("Successfully uncompleted progress with ID: " + progressId + " for user with ID: " + userId);
     }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressRepository.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressRepository.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -11,5 +11,11 @@
     Long getCourseId(@Param("progressId") Long progressId);
 
+    @Query("select ucp.enrollment.id from UserCourseProgress ucp where ucp.id = :progressId")
+    Long getEnrollmentId(@Param("progressId") Long progressId);
+
     @Query("select ucp from UserCourseProgress ucp where ucp.enrollment.id = :enrollmentId")
     List<UserCourseProgress> findByEnrollmentId(@Param("enrollmentId") Long enrollmentId);
+
+    @Query("select ucp from UserCourseProgress ucp where ucp.enrollment.id = :enrollmentId and ucp.completed = true")
+    List<UserCourseProgress> findByEnrollmentIdAAndCompletedTrue(@Param("enrollmentId") Long enrollmentId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/ImplUserCourseProgressService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/ImplUserCourseProgressService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/ImplUserCourseProgressService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -8,8 +8,11 @@
 public interface ImplUserCourseProgressService {
 
-    UserCourseProgressDto completeUserCourseProgress(Long progressId, Long userId);
+    List<UserCourseProgress> saveAllUserCourseProgress(List<UserCourseProgress> userCourseProgresses);
 
-    UserCourseProgressDto uncompleteUserCourseProgress(Long progressId, Long userId);
+    UserCourseProgress completeUserCourseProgress(Long progressId, Long userId);
+
+    UserCourseProgress uncompleteUserCourseProgress(Long progressId, Long userId);
 
     List<UserCourseProgress> getUserCourseProgressByEnrollment(Long enrollmentId);
+    List<UserCourseProgress> getUserCourseProgressByEnrollmentAndCompletedTrue(Long enrollmentId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/UserCourseProgressService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/UserCourseProgressService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/UserCourseProgressService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -5,6 +5,4 @@
 import com.shifterwebapp.shifter.exception.AccessDeniedException;
 import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressDto;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressMapper;
 import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressRepository;
 import lombok.RequiredArgsConstructor;
@@ -19,5 +17,4 @@
 
     private final UserCourseProgressRepository userCourseProgressRepository;
-    private final UserCourseProgressMapper userCourseProgressMapper;
     private final EnrollmentService enrollmentService;
     private final Validate validate;
@@ -29,8 +26,19 @@
 
     @Override
-    public UserCourseProgressDto completeUserCourseProgress(Long progressId, Long userId) {
+    public List<UserCourseProgress> getUserCourseProgressByEnrollmentAndCompletedTrue(Long enrollmentId) {
+        return userCourseProgressRepository.findByEnrollmentIdAAndCompletedTrue(enrollmentId);
+    }
+
+    @Override
+    public List<UserCourseProgress> saveAllUserCourseProgress(List<UserCourseProgress> userCourseProgresses) {
+        return userCourseProgressRepository.saveAll(userCourseProgresses);
+    }
+
+    @Override
+    public UserCourseProgress completeUserCourseProgress(Long progressId, Long userId) {
         validate.validateUserCourseProgressExists(progressId);
 
         Long courseId = userCourseProgressRepository.getCourseId(progressId);
+        Long enrollmentId = userCourseProgressRepository.getEnrollmentId(progressId);
 
         boolean isUserEnrolledInCourse = enrollmentService.isUserEnrolledInCourse(userId, courseId);
@@ -39,4 +47,6 @@
         }
 
+        enrollmentService.updateEnrollmentStatusToCompleted(enrollmentId);
+
         UserCourseProgress userCourseProgress = userCourseProgressRepository.findById(progressId).orElseThrow();
         userCourseProgress.setCompleted(true);
@@ -44,9 +54,9 @@
         userCourseProgressRepository.save(userCourseProgress);
 
-        return userCourseProgressMapper.toDto(userCourseProgress);
+        return userCourseProgress;
     }
 
     @Override
-    public UserCourseProgressDto uncompleteUserCourseProgress(Long progressId, Long userId) {
+    public UserCourseProgress uncompleteUserCourseProgress(Long progressId, Long userId) {
         validate.validateUserCourseProgressExists(progressId);
 
@@ -63,5 +73,7 @@
         userCourseProgressRepository.save(userCourseProgress);
 
-        return userCourseProgressMapper.toDto(userCourseProgress);
+        return userCourseProgress;
     }
+
+
 }
Index: backend/src/main/resources/email-templates/consultation_reminder.html
===================================================================
--- backend/src/main/resources/email-templates/consultation_reminder.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/resources/email-templates/consultation_reminder.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,175 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>${subject}</title>
+    <style>
+        /* Universal inline styles for email client compatibility */
+        body, p, h1, h2, h3, h4, h5, h6 {
+            margin: 0;
+            padding: 0;
+        }
+
+        body {
+            font-family: Arial, Helvetica, sans-serif;
+            font-size: 16px;
+            line-height: 1.6;
+            color: #333333;
+            background-color: #F8F6F5; /* mainBgColor */
+        }
+
+        table {
+            border-collapse: collapse;
+        }
+
+        a {
+            text-decoration: none;
+        }
+
+        .button {
+            display: inline-block;
+            padding: 12px 24px;
+            border-radius: 4px;
+            background-color: #008CC2; /* primaryColor/buttonBgColor */
+            color: #ffffff !important;
+            font-weight: bold;
+            text-decoration: none;
+            font-size: 16px;
+            text-align: center; /* Ensures text is centered */
+            width: auto; /* Ensure button width adapts */
+        }
+    </style>
+</head>
+<body>
+<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
+    <tr>
+        <td align="center">
+            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+
+                <tr>
+                    <td align="left" style="padding: 0 20px;">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                            <tr>
+                                <td align="left" style="padding-bottom: 10px;">
+                                    <a href="https://www.shift-er.com" target="_blank">
+                                        <img src="https://www.shif-er.com/public/Shifter-S2W-Transparent.png" alt="Shifter Logo" width="120"
+                                             style="display: block; border: 0;">
+                                    </a>
+                                </td>
+                                <td align="right" style="font-size: 14px; color: #666666;">
+                                    <a href="https://www.shift-er.com/learn" target="_blank"
+                                       style="color: #666666; text-decoration: none;">My Courses</a>
+                                    |
+                                    <a href="https://www.shift-er.com/courses" target="_blank"
+                                       style="color: #666666; text-decoration: none;">Course Catalog</a>
+                                </td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="20">&nbsp;</td>
+                </tr>
+
+                <tr>
+                    <td align="center" bgcolor="#FFFFFF"
+                        style="border-radius: 8px; padding: 40px 40px 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                            <tr>
+                                <td align="left">
+                                    <h1 style="font-size: 30px; line-height: 1.2; margin-bottom: 20px;">
+                                        ${reminderHeading}</h1>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td align="left">
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px;">
+                                        ${reminderText}
+                                    </p>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left" style="padding: 10px 0 25px 0;">
+                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px;">
+                                        <tr>
+                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Date:</td>
+                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${meetingDate}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">${meetingTime}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Location:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">Online - Zoom</td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="center" style="padding: 10px 0 30px 0;">
+                                    <table border="0" cellpadding="0" cellspacing="0" role="presentation">
+                                        <tr>
+                                            <td align="center">
+                                                <a href="${zoomLink}" target="_blank" class="button">
+                                                    CLICK HERE TO JOIN
+                                                </a>
+                                            </td>
+                                        </tr>
+                                    </table>
+
+                                    <p style="font-size: 14px; line-height: 1.5; color: #555555; margin-top: 15px;">
+                                        If the button doesn't work, join here:
+                                        <br>
+                                        <a href="${zoomLink}" target="_blank" style="color: #008CC2; word-break: break-all; text-decoration: underline;">
+                                            ${zoomLink}
+                                        </a>
+                                    </p>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left">
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 15px;">
+                                        This session is designed to understand your challenges, goals, and preferences. Our expert will provide valuable insights and a personalized program recommendation.
+                                    </p>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 0;">
+                                        <strong>We look forward to helping you take the next step!</strong>
+                                    </p>
+
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-top: 15px;">
+                                        If you need to <strong>reschedule or cancel</strong>, please send an email to our dedicated support team here:
+                                        <a href="mailto:support@shift-er.com" style="color: #008CC2; text-decoration: underline;">support@shift-er.com</a>
+                                    </p>
+                                </td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
+                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
+                        <p style="margin-top: 10px;">Need Help? Contact our support at <a
+                                href="mailto:support@shift-er.com" style="color: #666666;">support@shift-er.com</a></p>
+                    </td>
+                </tr>
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
+</body>
+</html>
Index: backend/src/main/resources/email-templates/course_purchase_confirmation.html
===================================================================
--- backend/src/main/resources/email-templates/course_purchase_confirmation.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/resources/email-templates/course_purchase_confirmation.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Welcome to ${courseName}!</title>
+    <style>
+        /* Universal inline styles for email client compatibility */
+        body, p, h1, h2, h3, h4, h5, h6 {
+            margin: 0;
+            padding: 0;
+        }
+
+        body {
+            font-family: Arial, Helvetica, sans-serif;
+            font-size: 16px;
+            line-height: 1.6;
+            color: #333333;
+            background-color: #F8F6F5;
+        }
+
+        table {
+            border-collapse: collapse;
+        }
+
+        a {
+            text-decoration: none;
+        }
+
+        .button {
+            display: inline-block;
+            padding: 12px 24px;
+            border-radius: 4px;
+            background-color: #008CC2;
+            color: #ffffff !important;
+            font-weight: bold;
+            text-decoration: none;
+            font-size: 16px;
+        }
+    </style>
+</head>
+<body>
+<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
+    <tr>
+        <td align="center">
+            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+
+                <!--TOP LINKS-->
+                <tr>
+                    <td align="left" style="padding: 0 20px;">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                            <tr>
+                                <td align="left" style="padding-bottom: 10px;">
+                                    <a href="https://www.shift-er.com" target="_blank">
+                                        <img src="https://www.shif-er.com/public/Shifter-S2W-Transparent.png" alt="Shifter Logo" width="120"
+                                             style="display: block; border: 0;">
+                                    </a>
+                                </td>
+                                <td align="right" style="font-size: 14px; color: #666666;">
+                                    <a href="https://www.shift-er.com/learn" target="_blank"
+                                       style="color: #666666; text-decoration: none;">My Courses</a>
+                                    |
+                                    <a href="https://www.shift-er.com/courses" target="_blank"
+                                       style="color: #666666; text-decoration: none;">Course Catalog</a>
+                                </td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="20">&nbsp;</td>
+                </tr>
+
+                <!--SECTION-->
+                <tr>
+                    <td align="center" bgcolor="#FFFFFF"
+                        style="border-radius: 8px; padding: 40px 40px 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                            <tr>
+                                <td align="left">
+                                    <h1 style="font-size: 32px; line-height: 1.2; color: #222222; margin-bottom: 20px;">
+                                        Start learning today!</h1>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td align="left">
+                                    <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                                        <tr>
+                                            <td width="100%%" valign="top">
+                                                <h2 style="font-size: 24px; font-weight: bold; margin-bottom: 15px;">
+                                                    Welcome to <span style="color: #008CC2;">${courseName}!</span></h2>
+                                                <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px;">
+                                                    ${courseDescription}
+                                                </p>
+                                                <a href="${accessUrl}" target="_blank" class="button">
+                                                    Start Learning
+                                                </a>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td height="20px" ></td>
+                            </tr>
+                            <tr>
+                                <td height="1" style="font-size: 1px; line-height: 1px; background-color: #DDDDDD;">
+                                    &nbsp;
+                                </td>
+                            </tr>
+                            <tr>
+                                <td height="20px" ></td>
+                            </tr>
+
+                            <tr>
+                                <td align="center" bgcolor="#FFFFFF">
+                                    <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                                        <tr>
+                                            <td align="left">
+                                                <h3 style="font-size: 20px; font-weight: bold; color: #222222; margin-bottom: 15px;">
+                                                    Tips to Maximize Your Learning Journey
+                                                </h3>
+                                                <ol style="padding-left: 20px; margin-top: 10px; font-size: 14px; line-height: 1.5; color: #555555;">
+                                                    <li style="margin-bottom: 10px;">
+                                                        <strong>Explain what you learned to someone else</strong>
+                                                        The best way to check your understanding is to teach the concept.
+                                                        If you can explain it simply, you know it well.
+                                                    </li>
+                                                    <li style="margin-bottom: 10px;">
+                                                        <strong>Eliminate distractions during study blocks.</strong>
+                                                        When you sit down to learn, silence your phone and close unnecessary tabs.
+                                                        Focused, shorter sessions are more effective than distracted, long ones.
+                                                    </li>
+                                                    <li style="margin-bottom: 10px;">
+                                                        <strong>Take frequent, short breaks</strong>
+                                                        Stepping away from your screen every 45-60 minutes keeps your mind fresh and prevents burnout.
+                                                        Grab water or stretch!
+                                                    </li>
+                                                    <li style="margin-bottom: 10px;">
+                                                        <strong>Take notes in your own words.</strong>
+                                                        Writing down key concepts helps your brain process and retain information much better than simply reading or listening.
+                                                    </li>
+                                                </ol>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
+                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
+<!--                        <p style="margin-top: 5px;">-->
+<!--                            <a href="https://your-domain.com/privacy" target="_blank" style="color: #666666;">Privacy-->
+<!--                                Policy</a> |-->
+<!--                            <a href="https://your-domain.com/terms" target="_blank" style="color: #666666;">Terms of-->
+<!--                                Service</a>-->
+<!--                        </p>-->
+                        <p style="margin-top: 10px;">Need Help? Contact our support at <a
+                                href="mailto:support@shift-er.com" style="color: #666666;">support@shift-er.com</a></p>
+                    </td>
+                </tr>
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
+</body>
+</html>
Index: backend/src/main/resources/email-templates/expert_meeting_info.html
===================================================================
--- backend/src/main/resources/email-templates/expert_meeting_info.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/resources/email-templates/expert_meeting_info.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>${subject}</title>
+    <style>
+        /* Universal inline styles for email client compatibility */
+        body, p, h1, h2, h3, h4, h5, h6 {
+            margin: 0;
+            padding: 0;
+        }
+
+        body {
+            font-family: Arial, Helvetica, sans-serif;
+            font-size: 16px;
+            line-height: 1.6;
+            color: #333333;
+            background-color: #F8F6F5; /* mainBgColor */
+        }
+
+        table {
+            border-collapse: collapse;
+        }
+
+        a {
+            text-decoration: none;
+        }
+    </style>
+</head>
+<body>
+<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
+    <tr>
+        <td align="center">
+            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+
+                <tr>
+                    <td align="left" style="padding: 0 20px;">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                            <tr>
+                                <td align="left" style="padding-bottom: 10px;">
+                                    <a href="https://www.shift-er.com" target="_blank">
+                                        <img src="https://www.shif-er.com/public/Shifter-S2W-Transparent.png" alt="Shifter Logo" width="120"
+                                             style="display: block; border: 0;">
+                                    </a>
+                                </td>
+                                <td align="right" style="font-size: 14px; color: #666666;">
+                                    Internal Notification
+                                </td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="20">&nbsp;</td>
+                </tr>
+
+                <tr>
+                    <td align="center" bgcolor="#FFFFFF"
+                        style="border-radius: 8px; padding: 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+
+                            <tr>
+                                <td align="left" style="padding-bottom: 20px;">
+                                    <h1 style="font-size: 26px; line-height: 1.2; color: #222222; margin-bottom: 10px;">
+                                        New Consultation Booked!
+                                    </h1>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555;">
+                                        A new user has booked a free consultation session. Please review the details below.
+                                    </p>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left">
+                                    <h2 style="font-size: 20px; font-weight: bold; margin-top: 15px; margin-bottom: 15px;">
+                                        Session Details
+                                    </h2>
+                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px; margin-bottom: 20px;">
+                                        <tr>
+                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Date:</td>
+                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${date}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">${time}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Zoom Link:</td>
+                                            <td style="padding-bottom: 8px;">
+                                                <a href="${zoomLink}" style="color: #008CC2; text-decoration: underline;" target="_blank">Join Meeting</a>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td height="1" style="font-size: 1px; line-height: 1px; background-color: #DDDDDD;">
+                                    &nbsp;
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left">
+                                    <h2 style="font-size: 20px; font-weight: bold; color: #222222; margin-top: 15px; margin-bottom: 15px;">
+                                        User Information
+                                    </h2>
+                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px; margin-bottom: 20px;">
+                                        <tr>
+                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Name:</td>
+                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${name}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;"> Email:</td>
+                                            <td style="padding-bottom: 8px;"><a href="mailto:${email}" style="color: #008CC2; text-decoration: underline;">${email}</a></td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Company Type:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">${companyType}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Position:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">${workPosition}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time Zone:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">${userTimeZone}</td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left">
+                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
+                                        About the Company:
+                                    </h3>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
+                                        ${aboutCompany}
+                                    </p>
+
+                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
+                                        Current Challenges:
+                                    </h3>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
+                                        ${challenges}
+                                    </p>
+
+                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
+                                        Expectations from the Session:
+                                    </h3>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
+                                        ${expectations}
+                                    </p>
+
+                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
+                                        Additional Information:
+                                    </h3>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
+                                        ${otherInfo}
+                                    </p>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left" style="padding-top: 20px;">
+                                    <p style="font-size: 16px; line-height: 1.6; color: #333333; font-weight: bold;">
+                                        Please review this information before the session to provide the best personalized guidance.
+                                    </p>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-top: 10px;">
+                                        Best regards,
+                                        <br>
+                                        The Shifter Team
+                                    </p>
+                                </td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+
+                <tr>
+                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
+                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
+                    </td>
+                </tr>
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
+</body>
+</html>
Index: backend/src/main/resources/email-templates/free_consultation_confirmation.html
===================================================================
--- backend/src/main/resources/email-templates/free_consultation_confirmation.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/resources/email-templates/free_consultation_confirmation.html	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Your Free Consultation is Scheduled!</title>
+    <style>
+        /* Universal inline styles for email client compatibility */
+        body, p, h1, h2, h3, h4, h5, h6 {
+            margin: 0;
+            padding: 0;
+        }
+
+        body {
+            font-family: Arial, Helvetica, sans-serif;
+            font-size: 16px;
+            line-height: 1.6;
+            color: #333333;
+            background-color: #F8F6F5; /* mainBgColor */
+        }
+
+        table {
+            border-collapse: collapse;
+        }
+
+        a {
+            text-decoration: none;
+        }
+
+        /* The .button class is still defined but not used here */
+        .button {
+            display: inline-block;
+            padding: 12px 24px;
+            border-radius: 4px;
+            background-color: #008CC2; /* primaryColor/buttonBgColor */
+            color: #ffffff !important;
+            font-weight: bold;
+            text-decoration: none;
+            font-size: 16px;
+        }
+    </style>
+</head>
+<body>
+<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
+    <tr>
+        <td align="center">
+            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+
+                <tr>
+                    <td align="left" style="padding: 0 20px;">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                            <tr>
+                                <td align="left" style="padding-bottom: 10px;">
+                                    <a href="https://www.shift-er.com" target="_blank">
+                                        <img src="https://www.shif-er.com/public/Shifter-S2W-Transparent.png" alt="Shifter Logo" width="120"
+                                             style="display: block; border: 0;">
+                                    </a>
+                                </td>
+                                <td align="right" style="font-size: 14px; color: #666666;">
+                                    <a href="https://www.shift-er.com/learn" target="_blank"
+                                       style="color: #666666; text-decoration: none;">My Courses</a>
+                                    |
+                                    <a href="https://www.shift-er.com/courses" target="_blank"
+                                       style="color: #666666; text-decoration: none;">Course Catalog</a>
+                                </td>
+                            </tr>
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="20">&nbsp;</td>
+                </tr>
+
+                <tr>
+                    <td align="center" bgcolor="#FFFFFF"
+                        style="border-radius: 8px; padding: 40px 40px 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
+                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
+                            <tr>
+                                <td align="left">
+                                    <h1 style="font-size: 30px; line-height: 1.2; margin-bottom: 20px;">
+                                        Consultation Scheduled!</h1>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td align="left">
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px;">
+                                        Thank you for booking a session with us. Your free consultation is successfully confirmed. Here are the details:
+                                    </p>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left" style="padding: 10px 0 25px 0;">
+                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px;">
+                                        <tr>
+                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Date:</td>
+                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${date}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">${time}</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Location:</td>
+                                            <td style="padding-bottom: 8px; color: #333333;">Online - Zoom</td>
+                                        </tr>
+                                        <tr>
+                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Link:</td>
+                                            <td style="padding-bottom: 8px;">
+                                                <a href="${zoomLink}" style="color: #008CC2; text-decoration: underline;" target="_blank">Join Meeting Here</a>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align="left">
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 15px;">
+                                        This session is designed to understand your challenges, goals, and preferences. Our expert will provide valuable insights and a personalized program recommendation.
+                                    </p>
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 0;">
+                                        <strong>We look forward to helping you take the next step!</strong>
+                                    </p>
+
+                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-top: 15px;">
+                                        If you need to <strong>reschedule or cancel</strong>, please send an email to our dedicated support team here:
+                                        <a href="mailto:support@shift-er.com" style="color: #008CC2; text-decoration: underline;">support@shift-er.com</a>
+                                    </p>
+                                </td>
+                            </tr>
+
+                        </table>
+                    </td>
+                </tr>
+
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
+                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
+                        <p style="margin-top: 10px;">Need Help? Contact our support at <a
+                                href="mailto:support@shift-er.com" style="color: #666666;">support@shift-er.com</a></p>
+                    </td>
+                </tr>
+                <tr>
+                    <td height="30">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
+</body>
+</html>
Index: backend/src/test/java/com/shifterwebapp/shifter/ShifterApplicationTests.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/ShifterApplicationTests.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ backend/src/test/java/com/shifterwebapp/shifter/ShifterApplicationTests.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,4 +1,6 @@
 package com.shifterwebapp.shifter;
 
+import io.github.cdimascio.dotenv.Dotenv;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -9,4 +11,37 @@
 class ShifterApplicationTests {
 
+	@BeforeAll
+	static void setupEnv() {
+		Dotenv dotenv = Dotenv.configure()
+				.ignoreIfMissing()
+				.load();
+
+		// Set env variables from .env file
+		System.setProperty("JWT_CONFIG_SECRET", dotenv.get("JWT_CONFIG_SECRET"));
+
+		System.setProperty("SPRING_DATASOURCE_URL", dotenv.get("SPRING_DATASOURCE_URL"));
+		System.setProperty("SPRING_DATASOURCE_USERNAME", dotenv.get("SPRING_DATASOURCE_USERNAME"));
+		System.setProperty("SPRING_DATASOURCE_PASSWORD", dotenv.get("SPRING_DATASOURCE_PASSWORD"));
+
+		System.setProperty("AWS_S3_REGION", dotenv.get("AWS_S3_REGION"));
+		System.setProperty("AWS_S3_BUCKET_NAME", dotenv.get("AWS_S3_BUCKET_NAME"));
+		System.setProperty("AWS_S3_ACCESS_KEY", dotenv.get("AWS_S3_ACCESS_KEY"));
+		System.setProperty("AWS_S3_SECRET_KEY", dotenv.get("AWS_S3_SECRET_KEY"));
+
+		System.setProperty("GOOGLE_CLIENT_ID", dotenv.get("GOOGLE_CLIENT_ID"));
+		System.setProperty("GOOGLE_CLIENT_SECRET", dotenv.get("GOOGLE_CLIENT_SECRET"));
+		System.setProperty("GOOGLE_EXPERT_CALENDAR_ID", dotenv.get("GOOGLE_EXPERT_CALENDAR_ID"));
+		System.setProperty("GOOGLE_REFRESH_TOKEN", dotenv.get("GOOGLE_REFRESH_TOKEN"));
+
+		System.setProperty("EMAIL_HOST", dotenv.get("EMAIL_HOST"));
+		System.setProperty("EMAIL_PORT", dotenv.get("EMAIL_PORT"));
+		System.setProperty("EMAIL_USERNAME", dotenv.get("EMAIL_USERNAME"));
+		System.setProperty("EMAIL_PASSWORD", dotenv.get("EMAIL_PASSWORD"));
+
+		System.setProperty("ZOOM_ACCOUNT_ID", dotenv.get("ZOOM_ACCOUNT_ID"));
+		System.setProperty("ZOOM_CLIENT_ID", dotenv.get("ZOOM_CLIENT_ID"));
+		System.setProperty("ZOOM_CLIENT_SECRET", dotenv.get("ZOOM_CLIENT_SECRET"));
+	}
+
 	@Test
 	void contextLoads() {
Index: ckend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,150 +1,0 @@
-//package com.shifterwebapp.shifter.unittests;
-//
-//import com.shifterwebapp.shifter.Validate;
-//import com.shifterwebapp.shifter.course.Course;
-//import com.shifterwebapp.shifter.course.CourseRepository;
-//import com.shifterwebapp.shifter.enrollment.Enrollment;
-//import com.shifterwebapp.shifter.enrollment.EnrollmentDto;
-//import com.shifterwebapp.shifter.enrollment.EnrollmentMapper;
-//import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
-//import com.shifterwebapp.shifter.enums.EnrollmentStatus;
-//import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-//import com.shifterwebapp.shifter.enums.PaymentMethod;
-//import com.shifterwebapp.shifter.payment.Payment;
-//import com.shifterwebapp.shifter.payment.PaymentRepository;
-//import com.shifterwebapp.shifter.enums.PaymentStatus;
-//import com.shifterwebapp.shifter.payment.service.PaymentService;
-//import com.shifterwebapp.shifter.user.User;
-//import com.shifterwebapp.shifter.user.service.UserService;
-//import org.junit.jupiter.api.Assertions;
-//import org.junit.jupiter.api.BeforeEach;
-//import org.junit.jupiter.api.Test;
-//import org.junit.jupiter.api.extension.ExtendWith;
-//import org.mockito.InjectMocks;
-//import org.mockito.Mock;
-//import org.mockito.Mockito;
-//import org.mockito.junit.jupiter.MockitoExtension;
-//
-//import java.util.Date;
-//import java.util.List;
-//import java.util.Optional;
-//
-//@ExtendWith(MockitoExtension.class)
-//public class TestEnrollmentService {
-//    @Mock
-//    EnrollmentRepository enrollmentRepository;
-//    @Mock
-//    CourseRepository courseRepository;
-//    @Mock
-//    PaymentRepository paymentRepository;
-//    @Mock
-//    PaymentService paymentService;
-//    @Mock
-//    EnrollmentMapper enrollmentMapper;
-//    @Mock
-//    UserService userService;
-//    @Mock
-//    Validate validate;
-//    @InjectMocks
-//    EnrollmentService enrollmentService;
-//
-//    Enrollment enrollment;
-//
-//    @BeforeEach
-//    public void setUp() {
-//        enrollment = Enrollment.builder()
-//                .enrollmentStatus(EnrollmentStatus.PENDING)
-//                .date(new Date())
-//                .payment(new Payment())
-//                .review(null)
-//                .course(new Course())
-//                .build();
-//    }
-//
-//    @Test
-//    public void test_getEnrollmentsByUser() {
-//        Long userId = 1L;
-//
-//        List<Enrollment> enrollments = List.of(enrollment);
-//
-//        List<EnrollmentDto> dtos = List.of(new EnrollmentDto());
-//        dtos.get(0).setEnrollmentStatus(EnrollmentStatus.ACTIVE);
-//
-//
-//        Mockito.when(enrollmentRepository.findEnrollmentsByUser(userId)).thenReturn(enrollments);
-//        Mockito.doNothing().when(validate).validateUserExists(userId);
-//        Mockito.when(enrollmentMapper.toDto(enrollments)).thenReturn(dtos);
-//
-//        List<EnrollmentDto> result = enrollmentService.getEnrollmentsByUser(userId);
-//        Assertions.assertEquals(dtos, result);
-//    }
-//
-//    @Test
-//    public void test_updateEnrollmentStatusToCompleted() {
-//        Long enrollmentId = 1L;
-//
-//        User mockUser = Mockito.mock(User.class);
-//        Mockito.when(mockUser.getId()).thenReturn(2L);
-//
-//        Payment mockPayment = Mockito.mock(Payment.class);
-//        Mockito.when(mockPayment.getUser()).thenReturn(mockUser);
-//
-//        Course mockCourse = Mockito.mock(Course.class);
-//        Mockito.when(mockCourse.getSkillsGained()).thenReturn(List.of());
-//
-//        enrollment.setPayment(mockPayment);
-//        enrollment.setCourse(mockCourse);
-//
-//        EnrollmentDto dto = new EnrollmentDto();
-//        dto.setEnrollmentStatus(EnrollmentStatus.COMPLETED);
-//
-//        Mockito.when(enrollmentRepository.findById(enrollmentId)).thenReturn(Optional.of(enrollment));
-//        Mockito.when(enrollmentRepository.save(enrollment)).thenReturn(enrollment);
-//        Mockito.when(enrollmentMapper.toDto(enrollment)).thenReturn(dto);
-//
-//        EnrollmentDto result = enrollmentService.updateEnrollmentStatusToCompleted(enrollmentId);
-//
-//        Assertions.assertEquals(dto, result);
-//    }
-//
-//    @Test
-//    public void test_updateEnrollmentStatusToActive() {
-//        Long enrollmentId = 1L;
-//
-//        EnrollmentDto dto = new EnrollmentDto();
-//        dto.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
-//
-//        Mockito.when(enrollmentRepository.findById(enrollmentId)).thenReturn(Optional.of(enrollment));
-//        Mockito.when(enrollmentRepository.save(enrollment)).thenReturn(enrollment);
-//        Mockito.when(enrollmentMapper.toDto(enrollment)).thenReturn(dto);
-//
-//        EnrollmentDto result = enrollmentService.updateEnrollmentStatusToActive(enrollmentId);
-//
-//        Assertions.assertEquals(dto, result);
-//    }
-//
-//    @Test
-//    public void test_enrollUser() {
-//        Long courseId = 1L;
-//        Long paymentId = 1L;
-//        Long userId = 1L;
-//        EnrollmentDto dto = new EnrollmentDto();
-//        dto.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
-//
-//        User mockUser = Mockito.mock(User.class);
-//
-//        Payment mockPayment = Mockito.mock(Payment.class);
-//        Mockito.when(mockPayment.getPaymentStatus()).thenReturn(PaymentStatus.COMPLETED);
-//
-//        Mockito.doNothing().when(validate).validateCourseExists(courseId);
-//        Mockito.doNothing().when(validate).validateUserExists(userId);
-//        Mockito.when(enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId)).thenReturn(false);
-//        Mockito.when(paymentService.initiatePayment(userId, courseId, PaymentMethod.CASYS)).thenReturn(mockPayment);
-//        Mockito.when(courseRepository.findById(courseId)).thenReturn(Optional.of(new Course()));
-//        Mockito.when(enrollmentRepository.save(Mockito.any(Enrollment.class))).thenAnswer(arguments -> arguments.getArgument(0));
-//        Mockito.when(enrollmentMapper.toDto(Mockito.any(Enrollment.class))).thenReturn(dto);
-//
-//        EnrollmentDto result = enrollmentService.enrollUser(courseId, paymentId);
-//        Assertions.assertEquals(dto, result);
-//    }
-//}
Index: ckend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,90 +1,0 @@
-//package com.shifterwebapp.shifter.unittests;
-//
-//import com.shifterwebapp.shifter.Validate;
-//import com.shifterwebapp.shifter.enrollment.Enrollment;
-//import com.shifterwebapp.shifter.review.ReviewMapper;
-//import com.shifterwebapp.shifter.review.ReviewRepository;
-//import com.shifterwebapp.shifter.review.Review;
-//import com.shifterwebapp.shifter.review.ReviewDto;
-//import com.shifterwebapp.shifter.review.service.ReviewService;
-//import org.junit.jupiter.api.Assertions;
-//import org.junit.jupiter.api.BeforeEach;
-//import org.junit.jupiter.api.Test;
-//import org.junit.jupiter.api.extension.ExtendWith;
-//import org.mockito.InjectMocks;
-//import org.mockito.Mock;
-//import org.mockito.Mockito;
-//import org.mockito.junit.jupiter.MockitoExtension;
-//
-//import java.util.Date;
-//import java.util.Optional;
-//
-//@ExtendWith(MockitoExtension.class)
-//public class TestReviewService {
-//
-//    @Mock
-//    ReviewRepository reviewRepository;
-//    @Mock
-//    ReviewMapper reviewMapper;
-//    @Mock
-//    Validate validate;
-//    @InjectMocks
-//    ReviewService reviewService;
-//
-//    Review review;
-//
-//    @BeforeEach
-//    public void setUp() {
-//        review = Review.builder()
-//                .id(1L)
-//                .rating(5)
-//                .comment("Comment")
-//                .canBeUsedAsTestimonial(true)
-//                .date(new Date())
-//                .enrollment(new Enrollment())
-//                .build();
-//    }
-//
-//    @Test
-//    public void test_getReviewById() {
-//        ReviewDto dto = new ReviewDto();
-//        dto.setId(1L);
-//        dto.setRating(5);
-//        dto.setComment("Comment");
-//        dto.setCanBeUsedAsTestimonial(true);
-//
-//        Mockito.when(reviewRepository.findById(1L)).thenReturn(Optional.of(review));
-//        Mockito.when(reviewMapper.toDto(review)).thenReturn(dto);
-//
-//        ReviewDto result = reviewService.getReviewById(1L);
-//        Assertions.assertNotNull(result);
-//        Assertions.assertEquals(1L, result.getId());
-//        Assertions.assertEquals(5, result.getRating());
-//        Assertions.assertEquals("Comment", result.getComment());
-//        Assertions.assertEquals(true, result.getCanBeUsedAsTestimonial());
-//    }
-//
-//    @Test
-//    public void test_getAverageRatingByCourse() {
-//        Long courseId = 1L;
-//
-//        Mockito.when(reviewRepository.findAverageRatingByCourse(courseId)).thenReturn(5.0);
-//        Mockito.doNothing().when(validate).validateCourseExists(courseId);
-//
-//        Double result = reviewService.getAverageRatingByCourse(courseId);
-//        Assertions.assertEquals(result, 5F);
-//    }
-//
-//    @Test
-//    public void test_hasBeenReviewedByUser() {
-//        Long courseId = 1L;
-//        Long userId = 1L;
-//
-//        Mockito.when(reviewRepository.findHasBeenReviewedByUser(userId, courseId)).thenReturn(true);
-//        Mockito.doNothing().when(validate).validateUserExists(userId);
-//        Mockito.doNothing().when(validate).validateCourseExists(courseId);
-//
-//        Boolean result = reviewService.hasBeenReviewedByUser(userId, courseId);
-//        Assertions.assertEquals(true, result);
-//    }
-//}
Index: frontend/package-lock.json
===================================================================
--- frontend/package-lock.json	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/package-lock.json	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -16,12 +16,18 @@
         "@mui/icons-material": "^7.1.2",
         "@mui/material": "^7.1.2",
+        "@react-three/fiber": "^9.3.0",
         "@splinetool/react-spline": "^4.0.0",
+        "@tabler/icons-react": "^3.35.0",
         "@tailwindcss/vite": "^4.1.10",
         "axios": "^1.10.0",
         "framer-motion": "^12.19.1",
+        "gsap": "^3.13.0",
         "lottie-react": "^2.4.1",
         "lucide-react": "^0.515.0",
+        "ogl": "^1.0.11",
         "qs": "^6.14.0",
         "react": "^19.1.0",
+        "react-bits": "^1.0.5",
+        "react-countup": "^6.5.3",
         "react-dom": "^19.1.0",
         "react-router-dom": "^7.6.2",
@@ -30,4 +36,5 @@
         "slick-carousel": "^1.8.1",
         "tailwindcss": "^4.1.10",
+        "three": "^0.179.1",
         "zustand": "^5.0.6"
       },
@@ -1642,4 +1649,60 @@
       }
     },
+    "node_modules/@react-three/fiber": {
+      "version": "9.3.0",
+      "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.3.0.tgz",
+      "integrity": "sha512-myPe3YL/C8+Eq939/4qIVEPBW/uxV0iiUbmjfwrs9sGKYDG8ib8Dz3Okq7BQt8P+0k4igedONbjXMQy84aDFmQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.17.8",
+        "@types/react-reconciler": "^0.32.0",
+        "@types/webxr": "*",
+        "base64-js": "^1.5.1",
+        "buffer": "^6.0.3",
+        "its-fine": "^2.0.0",
+        "react-reconciler": "^0.31.0",
+        "react-use-measure": "^2.1.7",
+        "scheduler": "^0.25.0",
+        "suspend-react": "^0.1.3",
+        "use-sync-external-store": "^1.4.0",
+        "zustand": "^5.0.3"
+      },
+      "peerDependencies": {
+        "expo": ">=43.0",
+        "expo-asset": ">=8.4",
+        "expo-file-system": ">=11.0",
+        "expo-gl": ">=11.0",
+        "react": "^19.0.0",
+        "react-dom": "^19.0.0",
+        "react-native": ">=0.78",
+        "three": ">=0.156"
+      },
+      "peerDependenciesMeta": {
+        "expo": {
+          "optional": true
+        },
+        "expo-asset": {
+          "optional": true
+        },
+        "expo-file-system": {
+          "optional": true
+        },
+        "expo-gl": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@react-three/fiber/node_modules/scheduler": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+      "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+      "license": "MIT"
+    },
     "node_modules/@react-types/shared": {
       "version": "3.30.0",
@@ -1944,4 +2007,30 @@
       "dependencies": {
         "tslib": "^2.8.0"
+      }
+    },
+    "node_modules/@tabler/icons": {
+      "version": "3.35.0",
+      "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.35.0.tgz",
+      "integrity": "sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/codecalm"
+      }
+    },
+    "node_modules/@tabler/icons-react": {
+      "version": "3.35.0",
+      "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.35.0.tgz",
+      "integrity": "sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==",
+      "license": "MIT",
+      "dependencies": {
+        "@tabler/icons": "3.35.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/codecalm"
+      },
+      "peerDependencies": {
+        "react": ">= 16"
       }
     },
@@ -2332,4 +2421,22 @@
       }
     },
+    "node_modules/@types/react-native": {
+      "version": "0.49.5",
+      "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.49.5.tgz",
+      "integrity": "sha512-8HN496FiPhmykCqmJ433c2mZgww0kZrtCmKCNhdajdQuPujOF+lcw5kxBVV5OaXJ9oIsbnNCvmmzSDPFPEZPCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
+    "node_modules/@types/react-reconciler": {
+      "version": "0.32.0",
+      "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.32.0.tgz",
+      "integrity": "sha512-+WHarFkJevhH1s655qeeSEf/yxFST0dVRsmSqUgxG8mMOKqycgYBv2wVpyubBY7MX8KiX5FQ03rNIwrxfm7Bmw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*"
+      }
+    },
     "node_modules/@types/react-slick": {
       "version": "0.23.13",
@@ -2350,4 +2457,16 @@
         "@types/react": "*"
       }
+    },
+    "node_modules/@types/scheduler": {
+      "version": "0.16.8",
+      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+      "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
+      "license": "MIT"
+    },
+    "node_modules/@types/webxr": {
+      "version": "0.5.22",
+      "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.22.tgz",
+      "integrity": "sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==",
+      "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
@@ -2680,4 +2799,18 @@
         "type": "github",
         "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/animated": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/animated/-/animated-0.2.2.tgz",
+      "integrity": "sha512-7pMzS0Sk2lA6/JT6he+apuy3GnDWUWVCurHMrpsbT9ugeLe80kpDQWjZQvkFiU9o7LsPGydPnoZpJsmt1HPPMA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "invariant": "^2.2.0",
+        "normalize-css-color": "^1.0.1"
+      },
+      "peerDependencies": {
+        "react": "*",
+        "react-dom": "*"
       }
     },
@@ -2782,4 +2915,24 @@
       "license": "MIT"
     },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
     "node_modules/blurhash": {
       "version": "2.0.5",
@@ -2845,4 +2998,28 @@
       }
     },
+    "node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
     "node_modules/call-bind-apply-helpers": {
       "version": "1.0.2",
@@ -3023,4 +3200,20 @@
       "engines": {
         "node": ">= 6"
+      }
+    },
+    "node_modules/countup.js": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.9.0.tgz",
+      "integrity": "sha512-llqrvyXztRFPp6+i8jx25phHWcVWhrHO4Nlt0uAOSKHB8778zzQswa4MU3qKBvkXfJKftRYFJuVHez67lyKdHg==",
+      "license": "MIT"
+    },
+    "node_modules/create-react-class": {
+      "version": "15.7.0",
+      "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz",
+      "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.3.1",
+        "object-assign": "^4.1.1"
       }
     },
@@ -3777,4 +3970,10 @@
       "license": "MIT"
     },
+    "node_modules/gsap": {
+      "version": "3.13.0",
+      "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.13.0.tgz",
+      "integrity": "sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw==",
+      "license": "Standard 'no charge' license: https://gsap.com/standard-license."
+    },
     "node_modules/has-flag": {
       "version": "4.0.0",
@@ -3841,4 +4040,24 @@
       "license": "MIT"
     },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
     "node_modules/ignore": {
       "version": "5.3.2",
@@ -3877,4 +4096,13 @@
       }
     },
+    "node_modules/invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.0.0"
+      }
+    },
     "node_modules/is-arrayish": {
       "version": "0.2.1",
@@ -3937,4 +4165,25 @@
       "dev": true,
       "license": "ISC"
+    },
+    "node_modules/its-fine": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz",
+      "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/react-reconciler": "^0.28.9"
+      },
+      "peerDependencies": {
+        "react": "^19.0.0"
+      }
+    },
+    "node_modules/its-fine/node_modules/@types/react-reconciler": {
+      "version": "0.28.9",
+      "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz",
+      "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "*"
+      }
     },
     "node_modules/jiti": {
@@ -4536,4 +4785,10 @@
       "license": "MIT"
     },
+    "node_modules/normalize-css-color": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz",
+      "integrity": "sha512-jPJ/V7Cp1UytdidsPqviKEElFQJs22hUUgK5BOPHTwOonNCk7/2qOxhhqzEajmFrWJowADFfOFh1V+aWkRfy+w==",
+      "license": "BSD-3-Clause"
+    },
     "node_modules/normalize-range": {
       "version": "0.1.2",
@@ -4566,4 +4821,10 @@
         "url": "https://github.com/sponsors/ljharb"
       }
+    },
+    "node_modules/ogl": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/ogl/-/ogl-1.0.11.tgz",
+      "integrity": "sha512-kUpC154AFfxi16pmZUK4jk3J+8zxwTWGPo03EoYA8QPbzikHoaC82n6pNTbd+oEaJonaE8aPWBlX7ad9zrqLsA==",
+      "license": "Unlicense"
     },
     "node_modules/on-change": {
@@ -4837,4 +5098,45 @@
       }
     },
+    "node_modules/react-bits": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/react-bits/-/react-bits-1.0.5.tgz",
+      "integrity": "sha512-WX4Y3tqmkCrGhLJXdogqYYpBCYtY02cjIj2TBA62vL/mWOEW33UYOZAwDKxPCY9J/K+8ghkXhtvJW1h4lq/HCg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/prop-types": "^15.5.2",
+        "@types/react": "^16.0.10",
+        "@types/react-native": "^0.49.2",
+        "animated": "^0.2.0",
+        "create-react-class": "^15.6.2",
+        "prop-types": "^15.6.0",
+        "react-timer-mixin": "^0.13.3"
+      },
+      "peerDependencies": {
+        "react": ">=16.0.0"
+      }
+    },
+    "node_modules/react-bits/node_modules/@types/react": {
+      "version": "16.14.65",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.65.tgz",
+      "integrity": "sha512-Guc3kE+W8LrQB9I3bF3blvNH15dXFIVIHIJTqrF8cp5XI/3IJcHGo4C3sJNPb8Zx49aofXKnAGIKyonE4f7XWg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "^0.16",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/react-countup": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.5.3.tgz",
+      "integrity": "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==",
+      "license": "MIT",
+      "dependencies": {
+        "countup.js": "^2.8.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.3.0"
+      }
+    },
     "node_modules/react-dom": {
       "version": "19.1.0",
@@ -4864,4 +5166,25 @@
         "url": "https://github.com/sponsors/gregberge"
       }
+    },
+    "node_modules/react-reconciler": {
+      "version": "0.31.0",
+      "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz",
+      "integrity": "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==",
+      "license": "MIT",
+      "dependencies": {
+        "scheduler": "^0.25.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "peerDependencies": {
+        "react": "^19.0.0"
+      }
+    },
+    "node_modules/react-reconciler/node_modules/scheduler": {
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+      "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+      "license": "MIT"
     },
     "node_modules/react-refresh": {
@@ -4930,4 +5253,10 @@
       }
     },
+    "node_modules/react-timer-mixin": {
+      "version": "0.13.4",
+      "resolved": "https://registry.npmjs.org/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz",
+      "integrity": "sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q==",
+      "license": "MIT"
+    },
     "node_modules/react-toastify": {
       "version": "11.0.5",
@@ -4957,4 +5286,19 @@
         "react": ">=16.6.0",
         "react-dom": ">=16.6.0"
+      }
+    },
+    "node_modules/react-use-measure": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz",
+      "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": ">=16.13",
+        "react-dom": ">=16.13"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        }
       }
     },
@@ -5288,4 +5632,13 @@
       }
     },
+    "node_modules/suspend-react": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz",
+      "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": ">=17.0"
+      }
+    },
     "node_modules/tabbable": {
       "version": "6.2.0",
@@ -5334,4 +5687,10 @@
         "node": ">=18"
       }
+    },
+    "node_modules/three": {
+      "version": "0.179.1",
+      "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz",
+      "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==",
+      "license": "MIT"
     },
     "node_modules/thumbhash": {
Index: frontend/package.json
===================================================================
--- frontend/package.json	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/package.json	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -18,12 +18,18 @@
     "@mui/icons-material": "^7.1.2",
     "@mui/material": "^7.1.2",
+    "@react-three/fiber": "^9.3.0",
     "@splinetool/react-spline": "^4.0.0",
+    "@tabler/icons-react": "^3.35.0",
     "@tailwindcss/vite": "^4.1.10",
     "axios": "^1.10.0",
     "framer-motion": "^12.19.1",
+    "gsap": "^3.13.0",
     "lottie-react": "^2.4.1",
     "lucide-react": "^0.515.0",
+    "ogl": "^1.0.11",
     "qs": "^6.14.0",
     "react": "^19.1.0",
+    "react-bits": "^1.0.5",
+    "react-countup": "^6.5.3",
     "react-dom": "^19.1.0",
     "react-router-dom": "^7.6.2",
@@ -32,4 +38,5 @@
     "slick-carousel": "^1.8.1",
     "tailwindcss": "^4.1.10",
+    "three": "^0.179.1",
     "zustand": "^5.0.6"
   },
Index: frontend/src/App.tsx
===================================================================
--- frontend/src/App.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/App.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -11,5 +11,5 @@
 import AppLoader from "./AppLoader.tsx";
 import Profile from "./pages/Profile.tsx";
-import Dashboard from "./pages/Dashboard.tsx";
+import Learn from "./pages/Learn.tsx";
 import FreeConsultation from "./pages/FreeConsultation.tsx";
 import PublicOnlyRoute from "./components/routeProtectors/PublicOnlyRoute.tsx";
@@ -20,13 +20,21 @@
 import AdminAddCourse from "./admin/pages/AdminAddCourse.tsx";
 import CourseLearn from "./pages/CourseLearn.tsx";
-import NavbarLearn from "./layout/NavbarLearn.tsx";
+import About from "./pages/About.tsx";
+import Contact from "./pages/Contact.tsx";
+import Mentoring from "./pages/Mentoring.tsx";
+import Consulting from "./pages/Consulting.tsx";
+import Academies from "./pages/Academies.tsx";
 
 function LayoutWrapper() {
     const location = useLocation();
-    const isLearn = location.pathname.startsWith("/learn");
     const hideLayout =
         location.pathname === "/login" ||
         location.pathname === "/register" ||
-        isLearn;
+        location.pathname.startsWith("/learn/");
+    const hideFooter =
+        location.pathname === "/mentoring" ||
+        location.pathname === "/consulting" ||
+        location.pathname === "/academies" ||
+        location.pathname === "/contact";
     const {user, authChecked} = useAuthContext();
 
@@ -51,5 +59,4 @@
         <>
             {!hideLayout && <Navbar/>}
-            {isLearn && <NavbarLearn/>}
             <Routes>
                 <Route path="/login" element={
@@ -64,7 +71,22 @@
                 }/>
 
+                <Route path="/about" element={<About/>}/>
+
                 <Route path="/" element={<Home/>}/>
+
+                <Route path="/mentoring" element={<Mentoring/>}/>
+
+                <Route path="/consulting" element={<Consulting/>}/>
+
+                <Route path="/academies" element={<Academies/>}/>
+
                 <Route path="/courses" element={<Courses/>}/>
                 <Route path="/courses/:courseId/:courseTitle" element={<CourseDetails/>}/>
+
+                <Route path="/contact" element={
+                    <UserOnlyRoute>
+                        <Contact />
+                    </UserOnlyRoute>
+                }/>
 
                 <Route path="/free-consultation" element={
@@ -82,5 +104,5 @@
                 <Route path="/learn" element={
                     <UserOnlyRoute>
-                        <Dashboard/>
+                        <Learn/>
                     </UserOnlyRoute>
                 }/>
@@ -92,5 +114,5 @@
 
             </Routes>
-            {!hideLayout && <Footer/>}
+            {(!hideLayout && !hideFooter) && <Footer/>}
         </>
     );
Index: frontend/src/api/contactApi.ts
===================================================================
--- frontend/src/api/contactApi.ts	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/api/contactApi.ts	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,17 @@
+import axios from "axios";
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+const backendUrl = import.meta.env.VITE_BACKEND_URL;
+
+export const sendEmailApi = async (accessToken: string, subject: string, text: string) => {
+    await axios.post(
+        `${backendUrl}/api/emails/contact-us`,
+        {subject, text},
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`
+            }
+        }
+    );
+}
Index: frontend/src/api/courseApi.ts
===================================================================
--- frontend/src/api/courseApi.ts	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/api/courseApi.ts	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -3,4 +3,5 @@
 import type {CourseDetail} from "../models/javaObjects/CourseDetail.tsx";
 import type {CourseFull} from "../models/javaObjects/CourseFull.tsx";
+import type {CoursePreviewEnrolled} from "../models/javaObjects/CoursePreviewEnrolled.tsx";
 
 // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -45,5 +46,5 @@
 }
 
-export const fetchEnrolledCoursesApi = async (accessToken: string): Promise<CoursePreview[]> => {
+export const fetchEnrolledCoursesApi = async (accessToken: string): Promise<CoursePreviewEnrolled[]> => {
     const res = await axios.get(`${backendUrl}/api/courses/enrolled`, {
         headers: {
Index: frontend/src/api/reviewApi.tsx
===================================================================
--- frontend/src/api/reviewApi.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/api/reviewApi.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,65 @@
+import axios from "axios";
+import type {Review} from "../models/Review.tsx";
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+const backendUrl = import.meta.env.VITE_BACKEND_URL;
+
+export const writeReviewApi = async (
+    accessToken: string,
+    courseId: number,
+    rating: number,
+    comment: string,
+): Promise<void> => {
+
+    await axios.post(
+        `${backendUrl}/api/review/${courseId}`,
+        {
+            rating,
+            comment
+        },
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`
+            }
+        }
+    );
+}
+
+export const updateReviewApi = async (
+    accessToken: string,
+    courseId: number,
+    rating: number,
+    comment: string,
+): Promise<void> => {
+
+    await axios.put(
+        `${backendUrl}/api/review/${courseId}`,
+        {
+            rating,
+            comment
+        },
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`
+            }
+        }
+    );
+}
+
+export const getReviewApi = async (
+    accessToken: string,
+    courseId: number,
+): Promise<Review> => {
+
+    const  res = await axios.get(
+        `${backendUrl}/api/review/course/${courseId}`,
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`
+            }
+        }
+    );
+
+    return res.data;
+}
Index: frontend/src/assets/CircularProgress.tsx
===================================================================
--- frontend/src/assets/CircularProgress.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/assets/CircularProgress.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,50 @@
+import React from "react";
+
+interface CircularProgressProps {
+    percentage: number; // 0 - 100
+    size?: number;
+    strokeWidth?: number;
+}
+
+const CircularProgress: React.FC<CircularProgressProps> = ({
+                                                               percentage,
+                                                               size = 20,
+                                                               strokeWidth = 2,
+                                                           }) => {
+    const radius = (size - strokeWidth) / 2;
+    const circumference = 2 * Math.PI * radius;
+    const offset = circumference - (percentage / 100) * circumference;
+
+    return (
+        <svg
+            width={size}
+            height={size}
+            className="transform -rotate-90"
+        >
+            {/* Background circle */}
+            <circle
+                cx={size / 2}
+                cy={size / 2}
+                r={radius}
+                stroke="var(--color-gray)" // Tailwind's gray-200
+                strokeWidth={strokeWidth}
+                fill="none"
+            />
+            {/* Progress circle */}
+            <circle
+                cx={size / 2}
+                cy={size / 2}
+                r={radius}
+                stroke="var(--color-shifter)" // Tailwind's blue-500
+                strokeWidth={strokeWidth}
+                fill="none"
+                strokeDasharray={circumference}
+                strokeDashoffset={offset}
+                strokeLinecap="round"
+                style={{ transition: "stroke-dashoffset 0.35s ease" }}
+            />
+        </svg>
+    );
+};
+
+export default CircularProgress;
Index: frontend/src/assets/animations/MagicBento.tsx
===================================================================
--- frontend/src/assets/animations/MagicBento.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/assets/animations/MagicBento.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,810 @@
+import React, { useRef, useEffect, useState, useCallback } from 'react';
+import { gsap } from 'gsap';
+import { IconRocket, IconTarget, IconTelescope } from "@tabler/icons-react";
+
+export interface BentoCardProps {
+    icon: React.ReactNode;
+    title: string;
+    description: string;
+    textAutoHide?: boolean;
+    disableAnimations?: boolean;
+}
+
+export interface BentoProps {
+    textAutoHide?: boolean;
+    enableStars?: boolean;
+    enableSpotlight?: boolean;
+    enableBorderGlow?: boolean;
+    disableAnimations?: boolean;
+    spotlightRadius?: number;
+    particleCount?: number;
+    enableTilt?: boolean;
+    glowColor?: string;
+    clickEffect?: boolean;
+    enableMagnetism?: boolean;
+}
+
+const DEFAULT_PARTICLE_COUNT = 12;
+const DEFAULT_SPOTLIGHT_RADIUS = 300;
+const DEFAULT_GLOW_COLOR = '0, 140, 194'; // RGB for "shifter" color
+const MOBILE_BREAKPOINT = 768;
+
+const cardData: BentoCardProps[] = [
+    {
+        icon: <IconTarget size={40} color="var(--color-white)" />,
+        title: "Purpose",
+        description: "To create positive change in the world of family entrepreneurship by empowering leaders to drive growth, inspire teams, strengthen culture, and achieve sustainable success."
+    },
+    {
+        icon: <IconRocket size={40} color="var(--color-white)" />,
+        title: "Mission",
+        description: "To empower family businesses to unlock their full potential and drive sustainable growth through mentorship, consulting, and digital learning programs, including online courses and academies."
+    },
+    {
+        icon: <IconTelescope size={40} color="var(--color-white)" />,
+        title: "Vision",
+        description: "To become the leading center for business development, transformation, and continuous learning for family businesses in Europe."
+    }
+];
+
+const createParticleElement = (x: number, y: number, color: string = DEFAULT_GLOW_COLOR): HTMLDivElement => {
+    const el = document.createElement('div');
+    el.className = 'particle';
+    el.style.cssText = `
+    position: absolute;
+    width: 4px;
+    height: 4px;
+    border-radius: 50%;
+    background: rgba(${color}, 1);
+    box-shadow: 0 0 6px rgba(${color}, 0.6);
+    pointer-events: none;
+    z-index: 100;
+    left: ${x}px;
+    top: ${y}px;
+  `;
+    return el;
+};
+
+const calculateSpotlightValues = (radius: number) => ({
+    proximity: radius * 0.5,
+    fadeDistance: radius * 0.75
+});
+
+const updateCardGlowProperties = (card: HTMLElement, mouseX: number, mouseY: number, glow: number, radius: number) => {
+    const rect = card.getBoundingClientRect();
+    const relativeX = ((mouseX - rect.left) / rect.width) * 100;
+    const relativeY = ((mouseY - rect.top) / rect.height) * 100;
+
+    card.style.setProperty('--glow-x', `${relativeX}%`);
+    card.style.setProperty('--glow-y', `${relativeY}%`);
+    card.style.setProperty('--glow-intensity', glow.toString());
+    card.style.setProperty('--glow-radius', `${radius}px`);
+};
+
+const ParticleCard: React.FC<{
+    children: React.ReactNode;
+    className?: string;
+    disableAnimations?: boolean;
+    style?: React.CSSProperties;
+    particleCount?: number;
+    glowColor?: string;
+    enableTilt?: boolean;
+    clickEffect?: boolean;
+    enableMagnetism?: boolean;
+}> = ({
+          children,
+          className = '',
+          disableAnimations = false,
+          style,
+          particleCount = DEFAULT_PARTICLE_COUNT,
+          glowColor = DEFAULT_GLOW_COLOR,
+          enableTilt = true,
+          clickEffect = false,
+          enableMagnetism = false
+      }) => {
+    const cardRef = useRef<HTMLDivElement>(null);
+    const particlesRef = useRef<HTMLDivElement[]>([]);
+    const timeoutsRef = useRef<NodeJS.Timeout[]>([]);
+    const isHoveredRef = useRef(false);
+    const memoizedParticles = useRef<HTMLDivElement[]>([]);
+    const particlesInitialized = useRef(false);
+    const magnetismAnimationRef = useRef<gsap.core.Tween | null>(null);
+
+    const initializeParticles = useCallback(() => {
+        if (particlesInitialized.current || !cardRef.current) return;
+
+        const { width, height } = cardRef.current.getBoundingClientRect();
+        memoizedParticles.current = Array.from({ length: particleCount }, () =>
+            createParticleElement(Math.random() * width, Math.random() * height, glowColor)
+        );
+        particlesInitialized.current = true;
+    }, [particleCount, glowColor]);
+
+    const clearAllParticles = useCallback(() => {
+        timeoutsRef.current.forEach(clearTimeout);
+        timeoutsRef.current = [];
+        magnetismAnimationRef.current?.kill();
+
+        particlesRef.current.forEach(particle => {
+            gsap.to(particle, {
+                scale: 0,
+                opacity: 0,
+                duration: 0.3,
+                ease: 'back.in(1.7)',
+                onComplete: () => {
+                    particle.parentNode?.removeChild(particle);
+                }
+            });
+        });
+        particlesRef.current = [];
+    }, []);
+
+    const animateParticles = useCallback(() => {
+        if (!cardRef.current || !isHoveredRef.current) return;
+
+        if (!particlesInitialized.current) {
+            initializeParticles();
+        }
+
+        memoizedParticles.current.forEach((particle, index) => {
+            const timeoutId = setTimeout(() => {
+                if (!isHoveredRef.current || !cardRef.current) return;
+
+                const clone = particle.cloneNode(true) as HTMLDivElement;
+                cardRef.current.appendChild(clone);
+                particlesRef.current.push(clone);
+
+                gsap.fromTo(clone, { scale: 0, opacity: 0 }, { scale: 1, opacity: 1, duration: 0.3, ease: 'back.out(1.7)' });
+
+                gsap.to(clone, {
+                    x: (Math.random() - 0.5) * 100,
+                    y: (Math.random() - 0.5) * 100,
+                    rotation: Math.random() * 360,
+                    duration: 2 + Math.random() * 2,
+                    ease: 'none',
+                    repeat: -1,
+                    yoyo: true
+                });
+
+                gsap.to(clone, {
+                    opacity: 0.3,
+                    duration: 1.5,
+                    ease: 'power2.inOut',
+                    repeat: -1,
+                    yoyo: true
+                });
+            }, index * 100);
+
+            timeoutsRef.current.push(timeoutId);
+        });
+    }, [initializeParticles]);
+
+    useEffect(() => {
+        if (disableAnimations || !cardRef.current) return;
+
+        const element = cardRef.current;
+
+        const handleMouseEnter = () => {
+            isHoveredRef.current = true;
+            animateParticles();
+
+            if (enableTilt) {
+                gsap.to(element, {
+                    rotateX: 5,
+                    rotateY: 5,
+                    duration: 0.3,
+                    ease: 'power2.out',
+                    transformPerspective: 1000
+                });
+            }
+        };
+
+        const handleMouseLeave = () => {
+            isHoveredRef.current = false;
+            clearAllParticles();
+
+            if (enableTilt) {
+                gsap.to(element, {
+                    rotateX: 0,
+                    rotateY: 0,
+                    duration: 0.3,
+                    ease: 'power2.out'
+                });
+            }
+
+            if (enableMagnetism) {
+                gsap.to(element, {
+                    x: 0,
+                    y: 0,
+                    duration: 0.3,
+                    ease: 'power2.out'
+                });
+            }
+        };
+
+        const handleMouseMove = (e: MouseEvent) => {
+            if (!enableTilt && !enableMagnetism) return;
+
+            const rect = element.getBoundingClientRect();
+            const x = e.clientX - rect.left;
+            const y = e.clientY - rect.top;
+            const centerX = rect.width / 2;
+            const centerY = rect.height / 2;
+
+            if (enableTilt) {
+                const rotateX = ((y - centerY) / centerY) * -3;
+                const rotateY = ((x - centerX) / centerX) * 3;
+
+                gsap.to(element, {
+                    rotateX,
+                    rotateY,
+                    duration: 0.1,
+                    ease: 'power2.out',
+                    transformPerspective: 1000
+                });
+            }
+
+            if (enableMagnetism) {
+                const magnetX = (x - centerX) * 0.05;
+                const magnetY = (y - centerY) * 0.05;
+
+                magnetismAnimationRef.current = gsap.to(element, {
+                    x: magnetX,
+                    y: magnetY,
+                    duration: 0.3,
+                    ease: 'power2.out'
+                });
+            }
+        };
+
+        const handleClick = (e: MouseEvent) => {
+            if (!clickEffect) return;
+
+            const rect = element.getBoundingClientRect();
+            const x = e.clientX - rect.left;
+            const y = e.clientY - rect.top;
+
+            const maxDistance = Math.max(
+                Math.hypot(x, y),
+                Math.hypot(x - rect.width, y),
+                Math.hypot(x, y - rect.height),
+                Math.hypot(x - rect.width, y - rect.height)
+            );
+
+            const ripple = document.createElement('div');
+            ripple.style.cssText = `
+        position: absolute;
+        width: ${maxDistance * 2}px;
+        height: ${maxDistance * 2}px;
+        border-radius: 50%;
+        background: radial-gradient(circle, rgba(${glowColor}, 0.4) 0%, rgba(${glowColor}, 0.2) 30%, transparent 70%);
+        left: ${x - maxDistance}px;
+        top: ${y - maxDistance}px;
+        pointer-events: none;
+        z-index: 1000;
+      `;
+
+            element.appendChild(ripple);
+
+            gsap.fromTo(
+                ripple,
+                {
+                    scale: 0,
+                    opacity: 1
+                },
+                {
+                    scale: 1,
+                    opacity: 0,
+                    duration: 0.8,
+                    ease: 'power2.out',
+                    onComplete: () => ripple.remove()
+                }
+            );
+        };
+
+        element.addEventListener('mouseenter', handleMouseEnter);
+        element.addEventListener('mouseleave', handleMouseLeave);
+        element.addEventListener('mousemove', handleMouseMove);
+        element.addEventListener('click', handleClick);
+
+        return () => {
+            isHoveredRef.current = false;
+            element.removeEventListener('mouseenter', handleMouseEnter);
+            element.removeEventListener('mouseleave', handleMouseLeave);
+            element.removeEventListener('mousemove', handleMouseMove);
+            element.removeEventListener('click', handleClick);
+            clearAllParticles();
+        };
+    }, [animateParticles, clearAllParticles, disableAnimations, enableTilt, enableMagnetism, clickEffect, glowColor]);
+
+    return (
+        <div
+            ref={cardRef}
+            className={`${className} relative overflow-hidden`}
+            style={{ ...style, position: 'relative', overflow: 'hidden' }}
+        >
+            {children}
+        </div>
+    );
+};
+
+const GlobalSpotlight: React.FC<{
+    gridRef: React.RefObject<HTMLDivElement | null>;
+    disableAnimations?: boolean;
+    enabled?: boolean;
+    spotlightRadius?: number;
+    glowColor?: string;
+}> = ({
+          gridRef,
+          disableAnimations = false,
+          enabled = true,
+          spotlightRadius = DEFAULT_SPOTLIGHT_RADIUS,
+          glowColor = DEFAULT_GLOW_COLOR
+      }) => {
+    const spotlightRef = useRef<HTMLDivElement | null>(null);
+    const isInsideSection = useRef(false);
+
+    useEffect(() => {
+        if (disableAnimations || !gridRef?.current || !enabled) return;
+
+        const spotlight = document.createElement('div');
+        spotlight.className = 'global-spotlight';
+        spotlight.style.cssText = `
+      position: fixed;
+      width: 800px;
+      height: 800px;
+      border-radius: 50%;
+      pointer-events: none;
+      background: radial-gradient(circle,
+        rgba(${glowColor}, 0.15) 0%,
+        rgba(${glowColor}, 0.08) 15%,
+        rgba(${glowColor}, 0.04) 25%,
+        rgba(${glowColor}, 0.02) 40%,
+        rgba(${glowColor}, 0.01) 65%,
+        transparent 70%
+      );
+      z-index: 200;
+      opacity: 0;
+      transform: translate(-50%, -50%);
+      mix-blend-mode: screen;
+    `;
+        document.body.appendChild(spotlight);
+        spotlightRef.current = spotlight;
+
+        const handleMouseMove = (e: MouseEvent) => {
+            if (!spotlightRef.current || !gridRef.current) return;
+
+            const section = gridRef.current.closest('.bento-section');
+            const rect = section?.getBoundingClientRect();
+            const mouseInside =
+                rect && e.clientX >= rect.left && e.clientX <= rect.right && e.clientY >= rect.top && e.clientY <= rect.bottom;
+
+            isInsideSection.current = mouseInside || false;
+            const cards = gridRef.current.querySelectorAll('.card');
+
+            if (!mouseInside) {
+                gsap.to(spotlightRef.current, {
+                    opacity: 0,
+                    duration: 0.3,
+                    ease: 'power2.out'
+                });
+                cards.forEach(card => {
+                    (card as HTMLElement).style.setProperty('--glow-intensity', '0');
+                });
+                return;
+            }
+
+            const { proximity, fadeDistance } = calculateSpotlightValues(spotlightRadius);
+            let minDistance = Infinity;
+
+            cards.forEach(card => {
+                const cardElement = card as HTMLElement;
+                const cardRect = cardElement.getBoundingClientRect();
+                const centerX = cardRect.left + cardRect.width / 2;
+                const centerY = cardRect.top + cardRect.height / 2;
+                const distance =
+                    Math.hypot(e.clientX - centerX, e.clientY - centerY) - Math.max(cardRect.width, cardRect.height) / 2;
+                const effectiveDistance = Math.max(0, distance);
+
+                minDistance = Math.min(minDistance, effectiveDistance);
+
+                let glowIntensity = 0;
+                if (effectiveDistance <= proximity) {
+                    glowIntensity = 1;
+                } else if (effectiveDistance <= fadeDistance) {
+                    glowIntensity = (fadeDistance - effectiveDistance) / (fadeDistance - proximity);
+                }
+
+                updateCardGlowProperties(cardElement, e.clientX, e.clientY, glowIntensity, spotlightRadius);
+            });
+
+            gsap.to(spotlightRef.current, {
+                left: e.clientX,
+                top: e.clientY,
+                duration: 0.1,
+                ease: 'power2.out'
+            });
+
+            const targetOpacity =
+                minDistance <= proximity
+                    ? 0.8
+                    : minDistance <= fadeDistance
+                        ? ((fadeDistance - minDistance) / (fadeDistance - proximity)) * 0.8
+                        : 0;
+
+            gsap.to(spotlightRef.current, {
+                opacity: targetOpacity,
+                duration: targetOpacity > 0 ? 0.2 : 0.5,
+                ease: 'power2.out'
+            });
+        };
+
+        const handleMouseLeave = () => {
+            isInsideSection.current = false;
+            gridRef.current?.querySelectorAll('.card').forEach(card => {
+                (card as HTMLElement).style.setProperty('--glow-intensity', '0');
+            });
+            if (spotlightRef.current) {
+                gsap.to(spotlightRef.current, {
+                    opacity: 0,
+                    duration: 0.3,
+                    ease: 'power2.out'
+                });
+            }
+        };
+
+        document.addEventListener('mousemove', handleMouseMove);
+        document.addEventListener('mouseleave', handleMouseLeave);
+
+        return () => {
+            document.removeEventListener('mousemove', handleMouseMove);
+            document.removeEventListener('mouseleave', handleMouseLeave);
+            spotlightRef.current?.parentNode?.removeChild(spotlightRef.current);
+        };
+    }, [gridRef, disableAnimations, enabled, spotlightRadius, glowColor]);
+
+    return null;
+};
+
+const BentoCardGrid: React.FC<{
+    children: React.ReactNode;
+    gridRef?: React.RefObject<HTMLDivElement | null>;
+}> = ({ children, gridRef }) => (
+    <div
+        className="bento-section gap-10 select-none relative"
+        style={{ fontSize: 'clamp(1rem, 0.9rem + 0.5vw, 1.5rem)' }}
+        ref={gridRef}
+    >
+        {children}
+    </div>
+);
+
+const useMobileDetection = () => {
+    const [isMobile, setIsMobile] = useState(false);
+
+    useEffect(() => {
+        const checkMobile = () => setIsMobile(window.innerWidth <= MOBILE_BREAKPOINT);
+
+        checkMobile();
+        window.addEventListener('resize', checkMobile);
+
+        return () => window.removeEventListener('resize', checkMobile);
+    }, []);
+
+    return isMobile;
+};
+
+const MagicBento: React.FC<BentoProps> = ({
+                                              textAutoHide = true,
+                                              enableStars = true,
+                                              enableSpotlight = true,
+                                              enableBorderGlow = true,
+                                              disableAnimations = false,
+                                              spotlightRadius = DEFAULT_SPOTLIGHT_RADIUS,
+                                              particleCount = DEFAULT_PARTICLE_COUNT,
+                                              enableTilt = false,
+                                              glowColor = DEFAULT_GLOW_COLOR,
+                                              clickEffect = true,
+                                              enableMagnetism = true
+                                          }) => {
+    const gridRef = useRef<HTMLDivElement>(null);
+    const isMobile = useMobileDetection();
+    const shouldDisableAnimations = disableAnimations || isMobile;
+
+    const baseBackgroundColor = "var(--color-beige)"; // White color for the cards
+    const textColor = "#060010"; // Dark color for the text
+
+    return (
+        <>
+            <style>
+                {`
+          .bento-section {
+            --glow-x: 50%;
+            --glow-y: 50%;
+            --glow-intensity: 0;
+            --glow-radius: 200px;
+            --glow-color: var(--color-shifter);
+            --border-color: rgba(0, 0, 0, 0.1);
+            --white: #f8f8f8;
+            --shifter: var(--color-shifter);
+          }
+          
+          .card-responsive {
+            grid-template-columns: 1fr;
+            padding: 0.5rem;
+          }
+          
+          @media (min-width: 600px) {
+            .card-responsive {
+              grid-template-columns: repeat(2, 1fr);
+            }
+          }
+          
+          @media (min-width: 1024px) {
+            .card-responsive {
+              grid-template-columns: repeat(3, 1fr);
+            }
+          }
+          
+          .card--border-glow::after {
+            content: '';
+            position: absolute;
+            inset: 0;
+            padding: 6px;
+            background: radial-gradient(var(--glow-radius) circle at var(--glow-x) var(--glow-y),
+                rgba(${DEFAULT_GLOW_COLOR}, calc(var(--glow-intensity) * 0.8)) 0%,
+                rgba(${DEFAULT_GLOW_COLOR}, calc(var(--glow-intensity) * 0.4)) 30%,
+                transparent 60%);
+            border-radius: inherit;
+            mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
+            mask-composite: subtract;
+            -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
+            -webkit-mask-composite: xor;
+            pointer-events: none;
+            transition: opacity 0.3s ease;
+            z-index: 1;
+          }
+          
+          .card--border-glow:hover::after {
+            opacity: 1;
+          }
+          
+          .card--border-glow:hover {
+            box-shadow: 0 4px 20px rgba(0, 140, 194, 0.4), 0 0 30px rgba(${DEFAULT_GLOW_COLOR}, 0.2);
+          }
+          
+          .particle::before {
+            content: '';
+            position: absolute;
+            top: -2px;
+            left: -2px;
+            right: -2px;
+            bottom: -2px;
+            background: rgba(${DEFAULT_GLOW_COLOR}, 0.2);
+            border-radius: 50%;
+            z-index: -1;
+          }
+          
+          .particle-container:hover {
+            box-shadow: 0 4px 20px rgba(46, 24, 78, 0.2), 0 0 30px rgba(${DEFAULT_GLOW_COLOR}, 0.2);
+          }
+          
+          .text-clamp-1 {
+            display: -webkit-box;
+            -webkit-box-orient: vertical;
+            -webkit-line-clamp: 1;
+            line-clamp: 1;
+            overflow: hidden;
+            text-overflow: ellipsis;
+          }
+          
+          .text-clamp-2 {
+            display: -webkit-box;
+            -webkit-box-orient: vertical;
+            -webkit-line-clamp: 2;
+            line-clamp: 2;
+            overflow: hidden;
+            text-overflow: ellipsis;
+          }
+          
+          @media (max-width: 599px) {
+            .card-responsive {
+              grid-template-columns: 1fr;
+              width: 90%;
+              margin: 0 auto;
+              padding: 0.5rem;
+            }
+            
+            .card-responsive .card {
+              // width: 100%;
+              // min-height: 180px;
+            }
+          }
+        `}
+            </style>
+
+            {enableSpotlight && (
+                <GlobalSpotlight
+                    gridRef={gridRef}
+                    disableAnimations={shouldDisableAnimations}
+                    enabled={enableSpotlight}
+                    spotlightRadius={spotlightRadius}
+                    glowColor={glowColor}
+                />
+            )}
+
+            <BentoCardGrid gridRef={gridRef}>
+                <div className="card-responsive grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
+                    {cardData.map((card, index) => {
+                        const baseClassName = `card flex flex-col items-start text-left gap-4 p-6 rounded-lg border border-solid font-light transition-all duration-100 ease-in-out hover:-translate-y-0.5 hover:shadow-[0_8px_25px_rgba(0,0,0,0.15)] ${
+                            enableBorderGlow ? 'card--border-glow' : ''
+                        }`;
+
+                        const cardStyle = {
+                            backgroundColor: baseBackgroundColor,
+                            borderColor: 'var(--border-color)',
+                            color: textColor,
+                            '--glow-x': '50%',
+                            '--glow-y': '50%',
+                            '--glow-intensity': '0',
+                            '--glow-radius': '200px'
+                        } as React.CSSProperties;
+
+                        const content = (
+                            <>
+                                <div className="p-4 bg-shifter rounded-md">{card.icon}</div>
+                                <h3 className={`font-normal text-3xl m-0 ${textAutoHide ? 'text-clamp-1' : ''}`}>
+                                    {card.title}
+                                </h3>
+                                <p
+                                    className={`text-base leading-5 opacity-90 `}
+                                >
+                                    {card.description}
+                                </p>
+                            </>
+                        );
+
+                        if (enableStars) {
+                            return (
+                                <ParticleCard
+                                    key={index}
+                                    className={baseClassName}
+                                    style={cardStyle}
+                                    disableAnimations={shouldDisableAnimations}
+                                    particleCount={particleCount}
+                                    glowColor={glowColor}
+                                    enableTilt={enableTilt}
+                                    clickEffect={clickEffect}
+                                    enableMagnetism={enableMagnetism}
+                                >
+                                    {content}
+                                </ParticleCard>
+                            );
+                        }
+
+                        return (
+                            <div
+                                key={index}
+                                className={baseClassName}
+                                style={cardStyle}
+                                ref={el => {
+                                    if (!el) return;
+
+                                    const handleMouseMove = (e: MouseEvent) => {
+                                        if (shouldDisableAnimations) return;
+
+                                        const rect = el.getBoundingClientRect();
+                                        const x = e.clientX - rect.left;
+                                        const y = e.clientY - rect.top;
+                                        const centerX = rect.width / 2;
+                                        const centerY = rect.height / 2;
+
+                                        if (enableTilt) {
+                                            const rotateX = ((y - centerY) / centerY) * -3;
+                                            const rotateY = ((x - centerX) / centerX) * 3;
+
+                                            gsap.to(el, {
+                                                rotateX,
+                                                rotateY,
+                                                duration: 0.1,
+                                                ease: 'power2.out',
+                                                transformPerspective: 1000
+                                            });
+                                        }
+
+                                        if (enableMagnetism) {
+                                            const magnetX = (x - centerX) * 0.05;
+                                            const magnetY = (y - centerY) * 0.05;
+
+                                            gsap.to(el, {
+                                                x: magnetX,
+                                                y: magnetY,
+                                                duration: 0.3,
+                                                ease: 'power2.out'
+                                            });
+                                        }
+                                    };
+
+                                    const handleMouseLeave = () => {
+                                        if (shouldDisableAnimations) return;
+
+                                        if (enableTilt) {
+                                            gsap.to(el, {
+                                                rotateX: 0,
+                                                rotateY: 0,
+                                                duration: 0.3,
+                                                ease: 'power2.out'
+                                            });
+                                        }
+
+                                        if (enableMagnetism) {
+                                            gsap.to(el, {
+                                                x: 0,
+                                                y: 0,
+                                                duration: 0.3,
+                                                ease: 'power2.out'
+                                            });
+                                        }
+                                    };
+
+                                    const handleClick = (e: MouseEvent) => {
+                                        if (!clickEffect || shouldDisableAnimations) return;
+
+                                        const rect = el.getBoundingClientRect();
+                                        const x = e.clientX - rect.left;
+                                        const y = e.clientY - rect.top;
+
+                                        const maxDistance = Math.max(
+                                            Math.hypot(x, y),
+                                            Math.hypot(x - rect.width, y),
+                                            Math.hypot(x, y - rect.height),
+                                            Math.hypot(x - rect.width, y - rect.height)
+                                        );
+
+                                        const ripple = document.createElement('div');
+                                        ripple.style.cssText = `
+                      position: absolute;
+                      width: ${maxDistance * 2}px;
+                      height: ${maxDistance * 2}px;
+                      border-radius: 50%;
+                      background: radial-gradient(circle, rgba(${glowColor}, 0.4) 0%, rgba(${glowColor}, 0.2) 30%, transparent 70%);
+                      left: ${x - maxDistance}px;
+                      top: ${y - maxDistance}px;
+                      pointer-events: none;
+                      z-index: 1000;
+                    `;
+
+                                        el.appendChild(ripple);
+
+                                        gsap.fromTo(
+                                            ripple,
+                                            {
+                                                scale: 0,
+                                                opacity: 1
+                                            },
+                                            {
+                                                scale: 1,
+                                                opacity: 0,
+                                                duration: 0.8,
+                                                ease: 'power2.out',
+                                                onComplete: () => ripple.remove()
+                                            }
+                                        );
+                                    };
+
+                                    el.addEventListener('mousemove', handleMouseMove);
+                                    el.addEventListener('mouseleave', handleMouseLeave);
+                                    el.addEventListener('click', handleClick);
+                                }}
+                            >
+                                {content}
+                            </div>
+                        );
+                    })}
+                </div>
+            </BentoCardGrid>
+        </>
+    );
+};
+
+export default MagicBento;
Index: frontend/src/assets/animations/Silk.tsx
===================================================================
--- frontend/src/assets/animations/Silk.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/assets/animations/Silk.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,171 @@
+/* eslint-disable react/no-unknown-property */
+import React, {forwardRef, useMemo, useRef, useLayoutEffect} from "react";
+import {Canvas, useFrame, useThree} from "@react-three/fiber";
+import {Color, Mesh, ShaderMaterial} from "three";
+
+type NormalizedRGB = [number, number, number];
+
+const hexToNormalizedRGB = (hex: string): NormalizedRGB => {
+    const clean = hex.replace("#", "");
+    const r = parseInt(clean.slice(0, 2), 16) / 255;
+    const g = parseInt(clean.slice(2, 4), 16) / 255;
+    const b = parseInt(clean.slice(4, 6), 16) / 255;
+    return [r, g, b];
+};
+
+interface UniformValue<T = number | Color> {
+    value: T;
+}
+
+interface SilkUniforms {
+    uSpeed: UniformValue<number>;
+    uScale: UniformValue<number>;
+    uNoiseIntensity: UniformValue<number>;
+    uColor: UniformValue<Color>;
+    uRotation: UniformValue<number>;
+    uTime: UniformValue<number>;
+
+    [uniform: string]: { value: any };
+}
+
+const vertexShader = `
+varying vec2 vUv;
+varying vec3 vPosition;
+
+void main() {
+  vPosition = position;
+  vUv = uv;
+  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
+}
+`;
+
+const fragmentShader = `
+varying vec2 vUv;
+varying vec3 vPosition;
+
+uniform float uTime;
+uniform vec3  uColor;
+uniform float uSpeed;
+uniform float uScale;
+uniform float uRotation;
+uniform float uNoiseIntensity;
+
+const float e = 2.71828182845904523536;
+
+float noise(vec2 texCoord) {
+  float G = e;
+  vec2  r = (G * sin(G * texCoord));
+  return fract(r.x * r.y * (1.0 + texCoord.x));
+}
+
+vec2 rotateUvs(vec2 uv, float angle) {
+  float c = cos(angle);
+  float s = sin(angle);
+  mat2  rot = mat2(c, -s, s, c);
+  return rot * uv;
+}
+
+void main() {
+  float rnd        = noise(gl_FragCoord.xy);
+  vec2  uv         = rotateUvs(vUv * uScale, uRotation);
+  vec2  tex        = uv * uScale;
+  float tOffset    = uSpeed * uTime;
+
+  tex.y += 0.03 * sin(8.0 * tex.x - tOffset);
+
+  float pattern = 0.6 +
+                  0.4 * sin(5.0 * (tex.x + tex.y +
+                                   cos(3.0 * tex.x + 5.0 * tex.y) +
+                                   0.02 * tOffset) +
+                           sin(20.0 * (tex.x + tex.y - 0.1 * tOffset)));
+
+  vec3 base = vec3(0.8); // white
+  vec3 color = mix(base, uColor, pattern); // pattern=0 -> white, pattern=1 -> uColor
+  vec4 col = vec4(color, 1.0) - rnd / 50.0 * uNoiseIntensity;
+  col.a = 1.0;
+  gl_FragColor = col;
+}
+`;
+
+interface SilkPlaneProps {
+    uniforms: SilkUniforms;
+}
+
+const SilkPlane = forwardRef<Mesh, SilkPlaneProps>(function SilkPlane(
+    {uniforms},
+    ref
+) {
+    const {viewport} = useThree();
+
+    useLayoutEffect(() => {
+        const mesh = ref as React.MutableRefObject<Mesh | null>;
+        if (mesh.current) {
+            mesh.current.scale.set(viewport.width, viewport.height, 1);
+        }
+    }, [ref, viewport]);
+
+    useFrame((_state, delta) => {
+        const mesh = ref as React.MutableRefObject<Mesh | null>;
+        if (mesh.current) {
+            const material = mesh.current.material as ShaderMaterial & {
+                uniforms: SilkUniforms;
+            };
+            material.uniforms.uTime.value += 0.1 * delta;
+        }
+    });
+
+    return (
+        <mesh ref={ref}>
+            <planeGeometry args={[1, 1, 1, 1]}/>
+            <shaderMaterial
+                uniforms={uniforms}
+                vertexShader={vertexShader}
+                fragmentShader={fragmentShader}
+            />
+        </mesh>
+    );
+});
+SilkPlane.displayName = "SilkPlane";
+
+export interface SilkProps {
+    speed?: number;
+    scale?: number;
+    color?: string;
+    noiseIntensity?: number;
+    rotation?: number;
+    className?: string;
+}
+
+const Silk: React.FC<SilkProps> = ({
+                                       speed = 5,
+                                       scale = 1,
+                                       color = "#7B7481",
+                                       noiseIntensity = 1.5,
+                                       rotation = 0,
+                                       className = "",
+                                   }) => {
+    const meshRef = useRef<Mesh>(null);
+
+    const uniforms = useMemo<SilkUniforms>(
+        () => ({
+            uSpeed: {value: speed},
+            uScale: {value: scale},
+            uNoiseIntensity: {value: noiseIntensity},
+            uColor: {value: new Color(...hexToNormalizedRGB(color))},
+            uRotation: {value: rotation},
+            uTime: {value: 0},
+        }),
+        [speed, scale, noiseIntensity, color, rotation]
+    );
+
+    return (
+        <div className={className}>
+            <Canvas dpr={[1, 2]} frameloop="always"
+            >
+                <SilkPlane ref={meshRef} uniforms={uniforms}/>
+            </Canvas>
+        </div>
+    );
+};
+
+export default Silk;
Index: frontend/src/assets/animations/SpikeAnimation.tsx
===================================================================
--- frontend/src/assets/animations/SpikeAnimation.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/assets/animations/SpikeAnimation.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,56 @@
+import React from "react";
+
+export function LightBeams(): React.ReactElement {
+    const beamCount = 120; // more beams for denser effect
+    const beams = Array.from({ length: beamCount }, (_, i) => {
+        const spacing = (window.innerWidth + 300) / beamCount; // tighter spacing
+        const x = i * spacing;
+        const width = 10 + Math.random() * 4; // thin but varied
+        const tilt = -50; // tilt to the right
+        const initialHeight = 120 + Math.random() * 80; // starting height
+
+        return (
+            <rect
+                key={i}
+                x={x}
+                y={320 - initialHeight}
+                width={width}
+                height={initialHeight}
+                fill="url(#grad)"
+                transform={`skewX(${tilt})`}
+            >
+                {/*<animate*/}
+                {/*    attributeName="height"*/}
+                {/*    values={`${initialHeight}; ${initialHeight + 60}; ${initialHeight}`}*/}
+                {/*    dur={`${2 + Math.random() * 2}s`}*/}
+                {/*    repeatCount="indefinite"*/}
+                {/*/>*/}
+                <animate
+                    attributeName="y"
+                    values={`${320 - initialHeight}; ${320 - (initialHeight - 40)}; ${320 - initialHeight}`}
+                    dur={`${1 + Math.random() * 2}s`}
+                    repeatCount="indefinite"
+                />
+
+            </rect>
+        );
+    });
+
+    return (
+        <div className="absolute bottom-0 left-0 w-full h-[80vh] overflow-hidden">
+            <svg viewBox="0 0 1440 320" preserveAspectRatio="none" className="w-full h-full">
+                <defs>
+                    <linearGradient id="grad" x1="0%" y1="0%" x2="0%" y2="100%">
+                        <stop offset="0%" stopColor="var(--color-beige)" />
+                        <stop offset="100%" stopColor="var(--color-shifter)" stopOpacity="0.8" />
+                    </linearGradient>
+                    <filter id="blur" x="-20%" y="-20%" width="140%" height="140%">
+                        <feGaussianBlur stdDeviation="10" />
+                    </filter>
+                </defs>
+
+                <g filter="url(#blur)">{beams}</g>
+            </svg>
+        </div>
+    );
+}
Index: frontend/src/assets/icons/LinkedIn.tsx
===================================================================
--- frontend/src/assets/icons/LinkedIn.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/assets/icons/LinkedIn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -9,4 +9,5 @@
                 d="M17 2a5 5 0 0 1 5 5v10a5 5 0 0 1 -5 5h-10a5 5 0 0 1 -5 -5v-10a5 5 0 0 1 5 -5zm-9 8a1 1 0 0 0 -1 1v5a1 1 0 0 0 2 0v-5a1 1 0 0 0 -1 -1m6 0a3 3 0 0 0 -1.168 .236l-.125 .057a1 1 0 0 0 -1.707 .707v5a1 1 0 0 0 2 0v-3a1 1 0 0 1 2 0v3a1 1 0 0 0 2 0v-3a3 3 0 0 0 -3 -3m-6 -3a1 1 0 0 0 -.993 .883l-.007 .127a1 1 0 0 0 1.993 .117l.007 -.127a1 1 0 0 0 -1 -1"/>
         </svg>
+
     )
 }
Index: frontend/src/assets/icons/StarFilled.tsx
===================================================================
--- frontend/src/assets/icons/StarFilled.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/assets/icons/StarFilled.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,9 +1,14 @@
-export default function StarFilled({className = "w-6 h-6 text-black"}) {
+export default function StarFilled({className = "w-6 h-6 text-black", strokeWidth = 2}) {
     return (
         <svg
             xmlns="http://www.w3.org/2000/svg"
             viewBox="0 0 24 24"
+            className={className}
             fill="currentColor"
-            className={className}>
+            stroke="currentColor"
+            strokeWidth={strokeWidth}
+            strokeLinecap="round"
+            strokeLinejoin="round"
+        >
             <path fillRule="evenodd"
                   d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.006 5.404.434c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.434 2.082-5.005Z"
Index: frontend/src/assets/icons/StarOutline.tsx
===================================================================
--- frontend/src/assets/icons/StarOutline.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/assets/icons/StarOutline.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,17 @@
+export default function StarFilled({className = "w-6 h-6 text-black", strokeWidth = 2}) {
+    return (
+        <svg
+            xmlns="http://www.w3.org/2000/svg"
+            viewBox="0 0 24 24"
+            fill="none"
+            className={className}
+            stroke="currentColor"
+            strokeWidth={strokeWidth}
+            strokeLinecap="round" strokeLinejoin="round"
+        >
+            <path fillRule="evenodd"
+                  d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.006 5.404.434c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.434 2.082-5.005Z"
+                  clipRule="evenodd"/>
+        </svg>
+    )
+}
Index: frontend/src/components/CollaborationSteps.tsx
===================================================================
--- frontend/src/components/CollaborationSteps.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/components/CollaborationSteps.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -29,5 +29,5 @@
 
     return (
-        <section className="text-white py-vertical-md px-horizontal-md flex flex-col gap-12 items-center">
+        <section className="bg-dark-blue text-white py-vertical-md px-horizontal-md flex flex-col gap-12 items-center">
             <h2 className="text-5xl font-light">
                 How to Start Your Journey to <strong className="font-bold">Success</strong>
@@ -37,6 +37,5 @@
                 {/* LINE AND DOTS */}
                 <div className="absolute w-[104%] top-1/2 -translate-y-1/2 left-1/2 -translate-x-1/2 -rotate-16">
-                    <hr className="border-t-4 border-white rounded-full w-full absolute top-2"
-                    />
+                    <hr className="border-t-4 border-white rounded-full w-full absolute top-2"/>
 
                     {[-0.2, 25, 50, 75, 99.8].map((percent, idx) => (
@@ -73,5 +72,5 @@
             <button className="hover:shadow-white/40 hover:shadow-lg transition-all duration-300 ease-in-out cursor-pointer
                 w-3/10 whitespace-nowrap py-2 bg-white text-xl text-dark-blue rounded-sm font-semibold shadow-md shadow-white/20">
-                Start Now
+                Get Started
             </button>
         </section>
Index: frontend/src/components/CourseCard.tsx
===================================================================
--- frontend/src/components/CourseCard.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/components/CourseCard.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -9,5 +9,4 @@
 import {useAuthContext} from "../context/AuthContext.tsx";
 import {toggleFavoriteCourseApi} from "../api/userApi.ts";
-import {showInfoToast} from "../utils/showInfoToast.ts";
 import {Sparkle} from "lucide-react";
 
@@ -95,13 +94,8 @@
             <div className="flex flex-wrap gap-2 whitespace-nowrap">
                 {
-                    card.ratingCount > 10 ? (
-                        <>
-                            <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                                <StarFilled className="w-4 h-4 text-gold"/> {card.rating / card.ratingCount}
-                            </div>
-                            <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                                {card.ratingCount} reviews
-                            </div>
-                        </>
+                    card.rating > 0 ? (
+                        <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
+                            <StarFilled className="w-4 h-4 text-gold"/> card.rating
+                        </div>
                     ) : (
                         <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
Index: frontend/src/components/CourseCardEnrolled.tsx
===================================================================
--- frontend/src/components/CourseCardEnrolled.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/CourseCardEnrolled.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,96 @@
+import type {CoursePreviewEnrolled} from "../models/javaObjects/CoursePreviewEnrolled.tsx";
+import {Link} from "react-router-dom";
+import React from "react";
+import {toUrlFormat} from "../utils/toUrlFormat.ts";
+import StarFilled from "../assets/icons/StarFilled.tsx";
+import StarOutline from "../assets/icons/StarOutline.tsx";
+import ModalReviewCourse from "./ModalReviewCourse.tsx";
+
+function CourseCardEnrolled({course, markCourseAsRated}: {
+    course: CoursePreviewEnrolled
+    markCourseAsRated: (rating: number) => void;
+}) {
+    const [showReviewModal, setShowReviewModal] = React.useState<boolean>(false);
+
+    return (
+        <aside className="h-full">
+            <Link
+                style={{"--card-color": course.color} as React.CSSProperties}
+                className="hover:shadow-md transition-all duration-300 ease-in-out
+                flex flex-col gap-2 items-center col-span-1 p-2 rounded-md h-full"
+                to={`/learn/${course.id}/${toUrlFormat(course.titleShort)}`}>
+
+                {/*IMAGE*/}
+                <div className="overflow-clip rounded-sm">
+                    <img src={course.imageUrl} alt={course.title}
+                         className="aspect-video object-cover"/>
+                </div>
+
+                {/*INFO*/}
+                <div className="flex flex-col gap-2 justify-between flex-1 text-left">
+                    <h3 className="text-md font-bold">{course.titleShort}</h3>
+
+                    <p className="text-black/60 text-sm">{
+                        course.topicsCovered.map(item =>
+                            item
+                                .toLowerCase()
+                                .replace(/_/g, " ")
+                                .replace(/\b\w/g, c => c.toUpperCase())
+                        )
+                            .join(" • ")
+                    }</p>
+                </div>
+
+                {/*PROGRESS BAR*/}
+                <div className="flex flex-col gap-1 items-start w-full">
+                    <div className="w-full bg-gray-200 rounded-full h-0.5">
+                        <div
+                            className="h-full rounded-full"
+                            style={{
+                                width: `${(course.lecturesFinishedCount / course.courseLectureCount) * 100}%`,
+                                backgroundColor: course.color,
+                            }}
+                        />
+                    </div>
+                    <div className="flex justify-between w-full">
+                        <p className="text-xs text-black/60">
+                            {course.lecturesFinishedCount / course.courseLectureCount * 100}% completed
+                        </p>
+                        {
+                            course.isFinished && (
+                                <button
+                                    onClick={(e) => {
+                                        e.preventDefault();
+                                        e.stopPropagation();
+                                        setShowReviewModal(true)
+                                    }}
+                                    className="hover:bg-black/5 px-2 rounded-xs
+                                    flex gap-1 cursor-pointer"
+                                >
+                                    {[1, 2, 3, 4, 5].map((star) => {
+                                        const courseRating = course.rating;
+                                        const StarIcon = courseRating > 0 && star <= courseRating ? StarFilled : StarOutline;
+                                        return <StarIcon key={star} className="w-2 text-yellow-400" />;
+                                    })}
+                                </button>
+                            )
+                        }
+                    </div>
+                </div>
+            </Link>
+
+            {
+                showReviewModal && (
+                    <ModalReviewCourse
+                        courseId={course.id}
+                        closeModal={() => setShowReviewModal(false)}
+                        markCourseAsRated={markCourseAsRated}
+                        isUpdate={true}
+                    />
+                )
+            }
+        </aside>
+    )
+}
+
+export default CourseCardEnrolled;
Index: frontend/src/components/CoursesFilters.tsx
===================================================================
--- frontend/src/components/CoursesFilters.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/components/CoursesFilters.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -99,20 +99,27 @@
                 }
                 <FilterSelect
+                    header={"Price"}
+                    options={price}
+                    handleFilter={handlePriceChange}
+                    selectedOptions={filters.price || []}
+                    mapper={priceToQueryMapper}
+                />
+                <FilterSelect
+                    header={"Topics"}
+                    options={topics}
+                    handleFilter={handleTopicChange}
+                    selectedOptions={filters.topic || []}
+                />
+                <FilterSelect
+                    header={"Skills"}
+                    options={skills}
+                    handleFilter={handleSkillChange}
+                    selectedOptions={filters.skill || []}
+                />
+                <FilterSelect
                     header={"Level"}
                     options={difficulty}
                     handleFilter={handleDifficultyChange}
                     selectedOptions={filters.difficulty || []}
-                />
-                <FilterSelect
-                    header={"Topics"}
-                    options={topics}
-                    handleFilter={handleTopicChange}
-                    selectedOptions={filters.topic || []}
-                />
-                <FilterSelect
-                    header={"Skills"}
-                    options={skills}
-                    handleFilter={handleSkillChange}
-                    selectedOptions={filters.skill || []}
                 />
                 <FilterSelect
@@ -122,11 +129,4 @@
                     selectedOptions={filters.duration || []}
                     mapper={durationToQueryMapper}
-                />
-                <FilterSelect
-                    header={"Price"}
-                    options={price}
-                    handleFilter={handlePriceChange}
-                    selectedOptions={filters.price || []}
-                    mapper={priceToQueryMapper}
                 />
 
Index: ontend/src/components/DashboardCourses.tsx
===================================================================
--- frontend/src/components/DashboardCourses.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,209 +1,0 @@
-import React, {useEffect, useState} from "react";
-import {fetchCoursesApi, fetchEnrolledCoursesApi} from "../api/courseApi.ts";
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {useCourseStorage} from "../context/CourseStorage.ts";
-import StarFilled from "../assets/icons/StarFilled.tsx";
-import {Sparkle} from "lucide-react";
-import {Link} from "react-router-dom";
-import {toUrlFormat} from "../utils/toUrlFormat.ts";
-
-function DashboardCourses() {
-    const {allCourses: allCoursesStorage, setAllCourses: setAllCoursesStorage} = useCourseStorage();
-    const {user, accessToken} = useAuthContext();
-
-    const [selectedTab, setSelectedTab] = useState("all");
-    const [enrolledCourses, setEnrolledCourses] = useState<CoursePreview[]>([]);
-    const [allCourses, setAllCourses] = useState<CoursePreview[]>(allCoursesStorage || []);
-
-    useEffect(() => {
-        // Enrolled courses
-        fetchEnrolledCoursesApi(accessToken || "")
-            .then(data => {
-                setEnrolledCourses(data);
-            })
-            .catch(error => {
-                console.error("Failed to fetch enrolled courses:", error);
-            })
-
-        if (allCoursesStorage && allCoursesStorage.length > 0) {
-            return;
-        }
-        const storedCourses = sessionStorage.getItem("allCourses");
-        if (storedCourses) {
-            setAllCoursesStorage(JSON.parse(storedCourses));
-            setAllCourses(JSON.parse(storedCourses));
-            return;
-        }
-        fetchCoursesApi(accessToken || "")
-            .then(courses => {
-                setAllCoursesStorage(courses);
-                setAllCourses(courses);
-                sessionStorage.setItem("allCourses", JSON.stringify(courses));
-            })
-            .catch(err => {
-                console.error("Failed to fetch courses:", err);
-            })
-    }, [accessToken]);
-
-
-    function renderContent() {
-        if (enrolledCourses.length === 0) {
-            return (
-                <h2 className="text-2xl font-semibold text-black/60">
-                    No limits, just potential — enroll in your first course!
-                </h2>
-            );
-        }
-
-        switch (selectedTab) {
-            case "all":
-                return (
-                    <>
-                        {
-                            enrolledCourses.map((course, index) => (
-                                <CourseList course={course} key={index}/>
-                            ))
-                        }
-                    </>
-                );
-            case "active":
-                return (
-                    <>
-                        {
-                            enrolledCourses.map((course, index) => (
-                                <CourseList course={course} key={index}/>
-                            ))
-                        }
-                    </>
-                );
-            case "completed":
-                return (
-                    <>
-                        {
-                            enrolledCourses.map((course, index) => (
-                                <CourseList course={course} key={index}/>
-                            ))
-                        }
-                    </>
-                );
-            case "favorites":
-                return (
-                    <>
-                        {
-                            allCourses.filter(course => user?.favoriteCourses.includes(course.id)).map((course, index) => (
-                                <CourseList course={course} key={index}/>
-                            ))
-                        }
-                    </>
-                );
-        }
-    }
-
-    return (
-        <section className="flex flex-col gap-4 text-left pt-top-nav-sm">
-            <h1 className="text-3xl font-semibold">My Courses</h1>
-            <ul>
-                <ListTab name={"All"} isSelected={selectedTab === "all"}
-                         setSelectedTab={() => setSelectedTab("all")}/>
-                <ListTab name={"Active"} isSelected={selectedTab === "active"}
-                         setSelectedTab={() => setSelectedTab("active")}/>
-                <ListTab name={"Completed"} isSelected={selectedTab === "completed"}
-                         setSelectedTab={() => setSelectedTab("completed")}/>
-                <ListTab name={"Favorites"} isSelected={selectedTab === "favorites"}
-                         setSelectedTab={() => setSelectedTab("favorites")}/>
-            </ul>
-            <div className="flex flex-col gap-4">
-                {renderContent()}
-            </div>
-        </section>
-    )
-}
-
-function CourseList({course}: { course: CoursePreview }) {
-
-    return (
-        <aside>
-            <Link
-                style={{"--card-color": course.color} as React.CSSProperties}
-                className="hover:shadow-md transition-all duration-300 ease-in-out
-                flex gap-8 items-center p-4 border-1 border-black/40 rounded-xl"
-                to={`/learn/${course.id}/${toUrlFormat(course.titleShort)}`}>
-                {/*IMAGE*/}
-                <div className="overflow-clip rounded-lg w-1/3">
-                    <img src={course.imageUrl} alt={course.title}
-                         className="aspect-video object-cover"/>
-                </div>
-
-                {/*INFO*/}
-                <div className="flex flex-col gap-4 w-2/3">
-                    {/*TITLE AND TOPICS COVERED*/}
-                    <div className="flex flex-col gap-0">
-                        <h3 className="text-xl font-bold">{course.titleShort}</h3>
-
-                        <p className="text-black/60">{
-                            course.topicsCovered.map(item =>
-                                item
-                                    .toLowerCase()
-                                    .replace(/_/g, " ")
-                                    .replace(/\b\w/g, c => c.toUpperCase())
-                            )
-                                .join(" • ")
-                        }</p>
-                    </div>
-
-                    {/*Info*/}
-                    <div className="flex flex-wrap gap-2 whitespace-nowrap">
-                        {
-                            course.ratingCount > 10 ? (
-                                <>
-                                    <div
-                                        className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                                        <StarFilled className="w-4 h-4 text-gold"/> {course.rating / course.ratingCount}
-                                    </div>
-                                    <div
-                                        className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                                        {course.ratingCount} reviews
-                                    </div>
-                                </>
-                            ) : (
-                                <div
-                                    className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                                    <Sparkle className="w-4 h-4 text-gold"/> New
-                                </div>
-                            )
-                        }
-                        <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                            {(course.durationMinutes / 60).toFixed(1)} hours
-                        </div>
-                        <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                            {course.courseContentCount} modules
-                        </div>
-                        <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                            {course.difficulty.charAt(0) + course.difficulty.slice(1).toLowerCase()}
-                        </div>
-                    </div>
-                </div>
-            </Link>
-        </aside>
-    )
-}
-
-function ListTab({name, isSelected, setSelectedTab}: {
-    name: string;
-    isSelected: boolean;
-    setSelectedTab: () => void;
-}) {
-    return (
-        <li className="inline-block text-lg font-medium ">
-            <button
-                className={`hover:text-black px-4 py-2 cursor-pointer ${isSelected ? "border-b-2 border-shifter" : "text-black/40"}`}
-                onClick={setSelectedTab}
-            >
-                {name}
-            </button>
-        </li>
-    )
-}
-
-export default DashboardCourses;
Index: frontend/src/components/HeroAbout.tsx
===================================================================
--- frontend/src/components/HeroAbout.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/HeroAbout.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,52 @@
+import { ArrowRight } from "lucide-react";
+import { Link } from "react-router-dom";
+import CountUp from "react-countup";
+
+function HeroAbout() {
+    return (
+        <section className="grid grid-cols-2 gap-x-20 px-horizontal-md py-vertical-lg pt-top-nav-md rounded-3xl bg-dark-blue/5
+                shadow-md shadow-black/20">
+
+            <div className="col-start-1 col-span-1 flex flex-col text-left gap-12
+                text-black-text">
+                <div className="flex flex-col gap-4 w-full">
+                    <h1 className=" text-5xl font-medium">About <span className="text-shifter font-black">Shifter</span></h1>
+                    <p>
+                        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
+                        industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type
+                        and scrambled it to make a type specimen book. It has survived not only five centuries, but also the
+                        leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s
+                        with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
+                        publishing software like Aldus PageMaker including versions of Lorem Ipsum.
+                    </p>
+                    <Link to={"/free-consultation"}
+                        className="flex gap-4 items-center text-white bg-shifter px-8 py-2 w-fit rounded-sm">
+                        Schedule a Free Consultation
+                        <ArrowRight size={20} strokeWidth={1.5} />
+                    </Link>
+                </div>
+
+                <hr className="border-t-2 border-black/20 w-full" />
+
+                <div className="flex justify-between w-full">
+                    <div>
+                        <h2 className="text-4xl font-bold"><CountUp start={0} end={250} duration={4} separator={"."}  />+</h2>
+                        <p className="font-light whitespace-nowrap">Clients Empowered</p>
+                    </div>
+                    <div>
+                        <h2 className="text-4xl font-bold"><CountUp start={0} end={2000} duration={4} separator={"."}  />+</h2>
+                        <p className="font-light whitespace-nowrap">Mentoring Hours</p>
+                    </div>
+                    <div>
+                        <h2 className="text-4xl font-bold"><CountUp start={0} end={4} duration={4} separator={"."}  />+</h2>
+                        <p className="font-light whitespace-nowrap">Years of Shifter</p>
+                    </div>
+                </div>
+            </div>
+
+            <div className="col-start-2 col-span-1 h-full bg-black/20 rounded-2xl"/>
+        </section>
+    )
+}
+
+export default HeroAbout;
Index: frontend/src/components/HeroHome.tsx
===================================================================
--- frontend/src/components/HeroHome.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/components/HeroHome.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,101 +1,70 @@
-import StarFilled from "../assets/icons/StarFilled.tsx";
-import ShifterArrow from "../../public/Shifter-Arrow.png";
+
 import {Link} from 'react-router-dom';
+import Silk from "../assets/animations/Silk.tsx";
+import CountUp from "react-countup";
 
 function HeroHome() {
 
     return (
-        <section
-            className="relative flex flex-col gap-0
-        items-center pt-top-nav-md bg-white w-full rounded-b-[60px]">
-            <h1 className="text-6xl">
-                Business <strong className="text-shifter">Excellence</strong>
-                <br/>
-                Powered by <strong className="text-shifter">Expertise</strong>
-            </h1>
+        <section className="relative ">
 
-            {/*<img src={ShifterRocket} alt="Shifter Rocket Image"*/}
-            {/*     className="absolute left-30 rotate-50 w-20 h-auto"/>*/}
+            <div className="relative flex flex-col items-center gap-0 rounded-4xl shadow-lg shadow-black/20
+             overflow-clip py-top-nav-lg">
+                <Silk
+                    className="absolute inset-0 opacity-90"
+                    speed={8}
+                    scale={1}
+                    color="#008CC2"
+                    noiseIntensity={1}
+                    rotation={0}
+                />
 
-            <div className="relative z-1 px-horizontal-md bg-white rounded-b-[60px] flex justify-between items-center w-full">
-
-                {/*LEFT TEXT*/}
-                <div className="relative max-w-sm text-left">
-                    <img src={ShifterArrow} alt="Shifter Arrow"
-                         className="absolute left-5 -top-30 h-35 w-30 rotate-40 opacity-20"/>
-                    <img src={ShifterArrow} alt="Shifter Arrow"
-                         className="absolute -left-25 top-5 h-35 w-30 -rotate-140 opacity-20"/>
-
-                    <p className="text-lg text-black leading-relaxed">
-                        We guide businesses from the basics of planning to complete transformations, offering
-                        expert
-                        mentoring, consulting, and e-learning. Whether you're starting small or aiming for major
-                        growth,
-                        we provide the support and tools to achieve lasting success!
-                    </p>
-                </div>
-
-                {/*CENTER IMAGE*/}
-                <div className="flex justify-center items-center w-fit h-fit overflow-clip">
-                    <div className="relative -bottom-20 bg-dark-gray/20 w-100 h-100 rounded-full"></div>
-
-                    {/*CTA BUTTONS*/}
-                    <div
-                        className="absolute bottom-5 flex gap-2 bg-gray/20 backdrop-blur-lg p-1 rounded-full border-3 border-black/5 text-md">
-                        <Link
-                            to="/free-consultation"
-                            className="hover:shadow-lg hover:shadow-shifter/50 transition-all duration-200 ease-in-out cursor-pointer
-                        rounded-full text-white px-8 py-3 bg-shifter border-3 border-white/50 font-semibold
-                        shadow-md shadow-shifter/30">
-                            Book a Free Consultation
-                        </Link>
-                        <Link
-                            to="/courses"
-                            className="hover:shadow-lg hover:shadow-shifter/50 transition-all duration-200 ease-in-out cursor-pointer
-                        rounded-full text-shifter px-8 py-3 bg-white border-3 border-shifter/50 font-bold
-                        shadow-md shadow-shifter/30">Explore
-                            Our Courses
-                        </Link>
+                <div className="flex flex-col gap-12 justify-center items-center z-1">
+                    <div className="flex flex-col gap-6 items-center justify-center">
+                        <div className="border-1 border-white/40
+                        bg-black/10 rounded-full py-1 px-8 font-medium text-sm text-white shadow-sm">
+                            {/*Simply Shift*/}
+                            Shift 2 Win
+                        </div>
+                        <h1 className="text-7xl font-semibold text-white max-w-3/4">
+                            {/*Get tailored strategies that actually work*/}
+                            Simplify your growth journey
+                        </h1>
+                        <p className="text-xl font-light text-white max-w-3/4">
+                            {/*Practical tools and guidance to help your business grow with ease.*/}
+                            {/*Expert mentorship, practical courses, and group academies in one place.*/}
+                            Expert guidance, practical courses, and group academies designed to help family-owned businesses thrive.
+                        </p>
                     </div>
-                </div>
-
-                {/*RIGHT STATISTICS*/}
-                <div className="flex flex-col gap-4 items-center">
-                    <div className=" grid grid-cols-2 grid-rows-2 gap-x-12 gap-y-6">
-                        <p className="text-right min-w-fit">
-                            <span className="text-3xl font-bold">20+</span> <br/>
-                            <span className="whitespace-nowrap font-light">Years Experience</span>
-                        </p>
-                        <p className="text-right">
-                            <span className="text-3xl font-bold">300+</span> <br/>
-                            <span className="whitespace-nowrap font-light">Clients Empowered</span>
-                        </p>
-                        <p className="text-right">
-                            <span className="text-3xl font-bold">10+</span> <br/>
-                            <span className="whitespace-nowrap font-light">Courses Available</span>
-                        </p>
-                        <p className="text-right">
-                            <span className="text-3xl font-bold">5000+</span> <br/>
-                            <span className="whitespace-nowrap font-light">Mentoring Hours</span>
-                        </p>
-                        {/*<p className="text-right">*/}
-                        {/*    <span className="text-3xl font-bold">2</span> <br/>*/}
-                        {/*    <span className="whitespace-nowrap font-light">Expert Mentors</span>*/}
-                        {/*</p>*/}
-                    </div>
-                    <div className="flex gap-1 text-gold">
-                        <StarFilled className="w-10 h-10 opacity-80"/>
-                        <StarFilled className="w-10 h-10 opacity-80"/>
-                        <StarFilled className="w-10 h-10 opacity-80"/>
-                        <StarFilled className="w-10 h-10 opacity-80"/>
-                        <StarFilled className="w-10 h-10 opacity-80"/>
-                    </div>
+                    <Link
+                        to="/free-consultation"
+                        className="hover:shadow-white/60 transition-all duration-200 ease-in-out cursor-pointer
+                        rounded-full text-black/90 px-8 py-3 bg-white font-bold border-2 border-black/20
+                        w-fit shadow-md shadow-white/40">
+                        Book a Free Consultation
+                    </Link>
                 </div>
             </div>
 
-            <div
-                className="shadow-md shadow-black/80
-                absolute bottom-0 w-full h-40 z-0 rounded-b-[60px]"
-            />
+            <div className="absolute bottom-0 translate-y-1/2 left-1/2 translate-x-[-50%] border-2 border-black/10
+                 flex justify-between bg-black/40 backdrop-blur-md w-9/10 py-6 px-24 rounded-lg">
+                <div className="text-white">
+                    <h3 className="text-4xl font-bold"><CountUp start={0} end={250} duration={4} separator={"."}  />+</h3>
+                    <p className="font-light whitespace-nowrap">Businesses Empowered</p>
+                </div>
+                <div className="text-white">
+                    <h3 className="text-4xl font-bold"><CountUp start={0} end={2000} duration={4} separator={"."}  />+</h3>
+                    <p className="font-light whitespace-nowrap">Mentoring Hours</p>
+                </div>
+                <div className="text-white">
+                    <h3 className="text-4xl font-bold"><CountUp start={0} end={4} duration={4} separator={"."}  />+</h3>
+                    <p className="font-light whitespace-nowrap">Years of Shifter</p>
+                </div>
+                <div className="text-white">
+                    <h3 className="text-4xl font-bold"><CountUp start={0} end={10} duration={4} separator={"."}  />+</h3>
+                    {/*<p className="font-light whitespace-nowrap">Courses & Academies Available</p>*/}
+                    <p className="font-light whitespace-nowrap">Growth Programs Delivered</p>
+                </div>
+            </div>
         </section>
     )
Index: frontend/src/components/ModalReviewCourse.tsx
===================================================================
--- frontend/src/components/ModalReviewCourse.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/ModalReviewCourse.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,175 @@
+import ReactDOM from "react-dom";
+import {X} from "lucide-react";
+import {useEffect, useState} from "react";
+import StarFilled from "../assets/icons/StarFilled";
+import StarOutline from "../assets/icons/StarOutline";
+import {getReviewApi, updateReviewApi, writeReviewApi} from "../api/reviewApi.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
+import ModalReviewCourseSkeleton from "./skeletons/ModalReviewCourseSkeleton.tsx";
+
+function ModalReviewCourse({
+                               courseId,
+                               closeModal,
+                               markCourseAsRated,
+                               isUpdate
+                           }: {
+    courseId: number;
+    closeModal: () => void;
+    markCourseAsRated: (rating: number) => void;
+    isUpdate: boolean;
+}) {
+    const {accessToken} = useAuthContext();
+    const [review, setReview] = useState({
+        rating: 0,
+        comment: "",
+    });
+    const [hovered, setHovered] = useState<number>(0);
+    const [loading, setLoading] = useState<boolean>(false);
+    const [fetchingReview, setFetchingReview] = useState<boolean>(false);
+    const [error, setError] = useState<string>("");
+
+    useEffect(() => {
+        if (!isUpdate)
+            return;
+
+        setFetchingReview(true);
+        getReviewApi(accessToken || "", courseId)
+            .then(review => {
+                setReview({rating: review.rating, comment: review.comment});
+            })
+            .catch((error) => {
+                console.error("Error fetching review:", error);
+                setError("Failed to load your review. Please try again later.");
+            })
+            .finally(() => {
+                setFetchingReview(false);
+            });
+    }, []);
+
+    const starTexts = [
+        "Select Rating",                    // default placeholder
+        "Poor – did not meet expectations", // 1 star
+        "Fair – could be better",           // 2 stars
+        "Average – okay, but room to improve", // 3 stars
+        "Good – I learned valuable things",    // 4 stars
+        "Excellent – exceeded expectations!"   // 5 stars
+    ];
+
+    const writeReview = () => {
+        if (review.rating === 0) {
+            setError("Please select a rating before submitting.");
+            return;
+        }
+
+        setLoading(true);
+        const apiCall = isUpdate ? updateReviewApi : writeReviewApi;
+        apiCall(
+            accessToken || "",
+            courseId,
+            review.rating,
+            review.comment
+        )
+            .then(() => {
+                markCourseAsRated(review.rating);
+                closeModal();
+            })
+            .catch((error) => {
+                console.error("Error writing review:", error);
+            })
+            .finally(() => {
+                setLoading(false);
+            });
+    }
+
+    if (fetchingReview)
+        return <ModalReviewCourseSkeleton closeModal={closeModal} />
+
+    return ReactDOM.createPortal(
+        <>
+            {/* Overlay */}
+            <div className="fixed inset-0 bg-gray/60 backdrop-blur-sm z-[1000]"/>
+
+            {/* Modal */}
+            <section
+                className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2
+                   bg-white shadow-lg py-4 px-6 z-[1000] max-w-1/2 min-w-1/3
+                   max-h-5/6 rounded-lg flex flex-col items-center gap-6
+                   text-black-text"
+            >
+                {/* Close button */}
+                <button
+                    onClick={closeModal}
+                    className="ml-auto flex justify-end cursor-pointer p-2 hover:bg-shifter/20 rounded-sm"
+                >
+                    <X size={24} strokeWidth={1.5}/>
+                </button>
+
+                <h2 className="text-2xl font-bold ">
+                    How Was Your Learning Experience?
+                </h2>
+
+                {/* STARS */}
+                <div className="flex flex-col gap-2 items-center">
+                    <div className="flex gap-4"
+                         onMouseLeave={() => setHovered(0)}
+                    >
+                        {[1, 2, 3, 4, 5].map((star) => {
+                            const filled = hovered ? star <= hovered : star <= review.rating;
+                            const StarIcon = filled ? StarFilled : StarOutline;
+
+                            return (
+                                <div
+                                    key={star}
+                                    onMouseEnter={() => setHovered(star)}
+                                    onClick={() =>
+                                        setReview({...review, rating: star})
+                                    }
+                                    className={`cursor-pointer transition-colors duration-150`}
+                                >
+                                    <StarIcon className="w-8 text-gold"/>
+                                </div>
+                            );
+                        })}
+                    </div>
+
+                    <span className="text-md">
+                        {hovered ? starTexts[hovered] : starTexts[review.rating]}
+                    </span>
+                </div>
+
+                <div className="w-full flex flex-col gap-1">
+                    <textarea
+                        className="focus:outline-none focus:border-shifter resize-none
+                        w-full border border-black/40 rounded-sm px-4 py-2"
+                        onChange={(e) =>
+                            setReview({...review, comment: e.target.value})
+                        }
+                        value={review.comment}
+                        placeholder="Share your thoughts about this course..."
+                        rows={4}
+                    />
+                    <span className="font-normal text-black/60 text-xs"><sup>*</sup>optional</span>
+                </div>
+
+                <div className="flex gap-6 mr-auto">
+                    <button
+                        onClick={writeReview}
+                        type="button"
+                        className="hover:shadow-md hover:shadow-shifter/40 shadow-sm shadow-shifter/20 transition-all duration-300 ease-in-out
+                    border-2 border-white/40 px-12 py-2 bg-shifter text-white cursor-pointer rounded-sm w-fit"
+                    >
+                        {loading ? "Submitting..." : "Submit Review"}
+                    </button>
+                    {loading && <div className="loader h-full"/>}
+                </div>
+
+                {error && (
+                    <p className="text-md text-red">{error}</p>
+                )}
+            </section>
+        </>,
+        document.getElementById("portal")!
+    );
+}
+
+export default ModalReviewCourse;
Index: frontend/src/components/NavbarLink.tsx
===================================================================
--- frontend/src/components/NavbarLink.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/components/NavbarLink.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -2,9 +2,9 @@
 
 const NavbarLink = ({to, label, className}: { to: string; label: string, className?: string; }) => (
-    <div className={`flex flex-col gap-0 overflow-clip p-1 group ${className}`}>
+    <div className={`flex flex-col gap-0 overflow-clip group ${className}`}>
         <Link to={to} className="transition-all duration-300 ease-in-out z-10">
             {label}
         </Link>
-        <hr className="relative -left-30 group-hover:-left-6 border-t-2 rounded-full transition-all duration-300 ease-in-out"/>
+        <hr className="relative -translate-x-40 group-hover:-translate-x-1/4 border-t-2 rounded-full transition-all duration-300 ease-in-out"/>
     </div>
 );
Index: frontend/src/components/OurServices.tsx
===================================================================
--- frontend/src/components/OurServices.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/OurServices.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,67 @@
+import {ArrowBigUpDash, BookOpen, GraduationCap, Handshake} from "lucide-react";
+import {Link} from "react-router-dom";
+
+function OurServices() {
+    const cardContent = [
+        {
+            title: "Mentoring",
+            description: "Personalized mentorship to help you overcome challenges and achieve your goals.",
+            icon: Handshake,
+            link: "/mentoring"
+        },
+        {
+            title: "Courses",
+            description: "On-demand courses to guide your journey at every stage.",
+            icon: BookOpen,
+            link: "/courses"
+        },
+        {
+            title: "Consulting",
+            description: "Targeted consulting to solve specific challenges and deliver immediate results.",
+            icon: ArrowBigUpDash ,
+            link: "/consulting"
+        },
+        {
+            title: "Academies",
+            description: "Structured group learning designed to help you grow and succeed together.",
+            icon: GraduationCap,
+            link: "/academies"
+        }
+    ]
+
+    return (
+        <section className="grid grid-cols-3 gap-20 justify-between py-vertical-lg pt-top-nav-lg px-horizontal-md">
+
+            {/*TEXT*/}
+            <div className="col-span-1 col-start-1 flex flex-col gap-2 text-black-text text-left w-full">
+                <h2 className="text-5xl font-bold">Solutions That Deliver Real Results</h2>
+                <p className="text-xl font-light">
+                    Shifter focuses on clear, practical steps that drive measurable growth.
+                </p>
+            </div>
+
+            {/*CARDS*/}
+            <div className="col-span-2 col-start-2 grid grid-cols-2 grid-rows-2 gap-8">
+                {
+                    cardContent.map((card, index) => (
+                        <div key={index}
+                             className={`shadow-md shadow-black/20
+                             ${index === 0 ? "bg-shifter/100 -rotate-3" : "bg-black/20"}
+                             ${index === 0 ? "text-white" : "text-black-text"}
+                            flex flex-col gap-8 items-start text-left border-2 border-white/40 rounded-2xl p-8 `}>
+                            <card.icon size={40} strokeWidth={1.5}
+                                       color={index === 0 ? "var(--color-white)" : "var(--color-black-text)"} className=""/>
+                            <div className="flex flex-col gap-2 justify-between">
+                                <h2 className="text-2xl font-bold">{card.title}</h2>
+                                <p className="text-lg font-light">{card.description}</p>
+                                <Link to={card.link} className="underline mt-4" >Show Service</Link>
+                            </div>
+                        </div>
+                    ))
+                }
+            </div>
+        </section>
+    )
+}
+
+export default OurServices;
Index: frontend/src/components/learn/CourseContentSideNav.tsx
===================================================================
--- frontend/src/components/learn/CourseContentSideNav.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/components/learn/CourseContentSideNav.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -4,13 +4,16 @@
 import type {CourseLectureFull} from "../../models/javaObjects/CourseLectureFull.tsx";
 import {X} from "lucide-react";
+import CircularProgress from "../../assets/CircularProgress.tsx";
 
-function CourseContentSideNav({ activeLecture, setActiveLecture, courseContents, updateLecture, closeModal }: {
+function CourseContentSideNav({ activeLecture, setActiveLecture, courseContents, updateLecture, closeModal, progressPercentage }: {
     activeLecture: CourseLectureFull,
     setActiveLecture: (lecture: CourseLectureFull) => void,
     courseContents: CourseContentFull[] | undefined,
     updateLecture: (progressId: number, isComplete: boolean) => void,
-    closeModal: () => void
+    closeModal: () => void,
+    progressPercentage: number
 }) {
     const [openContentIds, setOpenContentIds] = useState<number[]>([]);
+
 
     const toggleAccordion = (contentId: number) => {
@@ -37,5 +40,12 @@
         <aside className="sticky top-0 right-0 min-w-28/100 h-screen overflow-y-auto border-l-1 border-black/20">
             <div className="py-4 px-4 flex items-center justify-between">
-                <h2 className="text-left font-bold">Course content</h2>
+                <div className="flex items-center gap-4">
+                    <CircularProgress
+                        percentage={progressPercentage}
+                        size={28}
+                        strokeWidth={2}
+                    />
+                    <h2 className="text-left font-bold">Course content</h2>
+                </div>
                 <button
                     onClick={closeModal}
Index: frontend/src/components/registerSteps/RegisterStepTwo.tsx
===================================================================
--- frontend/src/components/registerSteps/RegisterStepTwo.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/components/registerSteps/RegisterStepTwo.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -11,10 +11,10 @@
 
     useEffect(() => {
-        if (!user.name || !user.workPosition || !user.companyType) {
+        if (!user.name || !user.workPosition || !user.companySize) {
             setError("Please ensure all inputs are completed.");
         } else {
             setError("");
         }
-    }, [user.name, user.workPosition, user.companyType]);
+    }, [user.name, user.workPosition, user.companySize]);
 
     return (
@@ -40,8 +40,8 @@
             />
             <RegisterSelect
-                label={"Company Type"}
-                name={"companyType"}
-                id={"company-type"}
-                options={["Freelance", "Startup", "SME", "Mid Market", "Enterprise", "Other"]}
+                label={"Company Size"}
+                name={"companySize"}
+                id={"company-size"}
+                options={["Freelance", "Micro", "Small", "Medium", "Mid Market", "Enterprise", "Other"]}
                 setUser={setUser}
                 user={user}
Index: frontend/src/components/skeletons/CourseCardEnrolledSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CourseCardEnrolledSkeleton.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/skeletons/CourseCardEnrolledSkeleton.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,29 @@
+function CourseCardEnrolledSkeleton() {
+    return (
+        <aside className="flex flex-col gap-2 items-center col-span-1 p-2 rounded-md">
+            {/* IMAGE skeleton */}
+            <div className="overflow-clip rounded-sm w-full">
+                <div className="aspect-video bg-gray-300 animate-pulse"></div>
+            </div>
+
+            {/* INFO skeleton */}
+            <div className="flex flex-col gap-2 text-left w-full">
+                {/* Title skeleton */}
+                <div className="h-5 bg-gray-300 rounded w-3/4 animate-pulse"></div>
+
+                {/* Topics skeleton */}
+                <div className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
+            </div>
+
+            {/* PROGRESS BAR skeleton */}
+            <div className="flex flex-col gap-1 items-start w-full">
+                <div className="w-full bg-gray-200 rounded-full h-0.5">
+                    <div className="h-full bg-gray-300 rounded-full w-1/3 animate-pulse"></div>
+                </div>
+                <div className="h-3 bg-gray-300 rounded w-20 animate-pulse"></div>
+            </div>
+        </aside>
+    );
+}
+
+export default CourseCardEnrolledSkeleton;
Index: frontend/src/components/skeletons/ModalReviewCourseSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/ModalReviewCourseSkeleton.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/skeletons/ModalReviewCourseSkeleton.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,61 @@
+import ReactDOM from "react-dom";
+import {X} from "lucide-react";
+import StarOutline from "../../assets/icons/StarOutline";
+
+function ModalReviewCourseSkeleton({closeModal}: {
+    closeModal: () => void;
+}) {
+    return ReactDOM.createPortal(
+        <>
+            {/* Overlay */}
+            <div className="fixed inset-0 bg-gray/60 backdrop-blur-sm z-[1000]"/>
+
+            {/* Modal */}
+            <section
+                className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2
+                   bg-white shadow-lg py-4 px-6 z-[1000] max-w-1/2 min-w-1/3
+                   max-h-5/6 rounded-lg flex flex-col items-center gap-6
+                   text-black-text"
+            >
+                {/* Close button */}
+                <button
+                    onClick={closeModal}
+                    className="ml-auto flex justify-end cursor-pointer p-2 hover:bg-shifter/20 rounded-sm"
+                >
+                    <X size={24} strokeWidth={1.5}/>
+                </button>
+
+                {/* Title skeleton */}
+                <div className="h-8 bg-gray-300 rounded w-80 animate-pulse"></div>
+
+                {/* Stars skeleton */}
+                <div className="flex flex-col gap-2 items-center">
+                    <div className="flex gap-4">
+                        {[1, 2, 3, 4, 5].map((star) => (
+                            <StarOutline
+                                key={star}
+                                className="w-8 h-8 text-gray-300 rounded animate-pulse"
+                            />
+                        ))}
+                    </div>
+                    {/* Star text skeleton */}
+                    <div className="h-6 bg-gray-300 rounded w-48 animate-pulse"></div>
+                </div>
+
+                {/* Textarea skeleton */}
+                <div className="w-full flex flex-col gap-1">
+                    <div className="w-full h-24 bg-gray-300 rounded-sm animate-pulse"></div>
+                    <div className="h-3 bg-gray-300 rounded w-16 animate-pulse"></div>
+                </div>
+
+                {/* Submit button skeleton */}
+                <div className="flex gap-6 mr-auto">
+                    <div className="h-10 bg-gray-300 rounded-sm w-32 animate-pulse"></div>
+                </div>
+            </section>
+        </>,
+        document.getElementById("portal")!
+    );
+}
+
+export default ModalReviewCourseSkeleton;
Index: frontend/src/context/AuthContext.tsx
===================================================================
--- frontend/src/context/AuthContext.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/context/AuthContext.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -24,4 +24,5 @@
     refreshAccessToken: () => Promise<void>;
     loading: boolean;
+    useFreeConsultation: () => void;
 }
 
@@ -36,4 +37,10 @@
     const [loading, setLoading] = useState(true);
     const navigate = useNavigate();
+
+    const useFreeConsultation = () => {
+        if (user) {
+            setUser({...user, hasUsedFreeConsultation: true});
+        }
+    }
 
     const register = async (user: UserRegister) => {
@@ -114,4 +121,5 @@
                 authChecked,
                 setAuthChecked,
+                useFreeConsultation,
                 register,
                 login,
Index: frontend/src/global.css
===================================================================
--- frontend/src/global.css	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/global.css	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -11,4 +11,5 @@
     --spacing-vertical-sm: 1rem;
 
+    --spacing-top-nav-xl: 9rem;
     --spacing-top-nav-lg: 8rem;
     --spacing-top-nav-md: 7rem;
@@ -16,7 +17,7 @@
 
 
-    --color-beige: #F0CFB5;
+    --color-beige: #F8F6F5;
     --color-shifter: #008CC2;
-    --color-red: #FF6F61;
+    --color-red: #E63946;
     --color-dark-blue: #002E5D;
     --color-deep-green: #2C6B3D;
@@ -27,4 +28,5 @@
     --color-gray: #E5E7EBFF;
     --color-black-text: #333333;
+    --color-white-text: #F8F8F8;
 
 
Index: frontend/src/hooks/useCourseLearn.tsx
===================================================================
--- frontend/src/hooks/useCourseLearn.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/hooks/useCourseLearn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -12,4 +12,46 @@
     const [videoUrl, setVideoUrl] = useState<string>("");
     const [isDownloading, setIsDownloading] = useState(false);
+    const [isLastLectureFinished, setIsLastLectureFinished] = useState(false);
+    const [progressPercentage, setProgressPercentage] = useState(0);
+
+    const courseFinishedPunchlines = [
+        "🎓 Course Completed - The Future is Yours to Shape!",
+        "🔥 Course Completed - Your Hard Work is Paying Off!",
+        "🌟 Course Completed - You’re Unlocking Your True Potential!",
+        "🚀 Course Completed - Your Journey to Success Continues!",
+        "🏆 Course Completed - You’re One Step Closer to Your Dreams!",
+        "💪 Course Completed - You’ve Proven Your Dedication!",
+        "✨ Course Completed - Your Growth is Inspiring!",
+        "🎉 Course Completed - You’re Ready for New Challenges!",
+        "💡 Course Completed - Your Knowledge is Expanding!",
+        "🎯 Course Completed - You’re Hitting Your Targets!",
+        "🌍 Course Completed - You’re Making an Impact!",
+        "💥 Course Completed - You’re Breaking Barriers!",
+        "🚀 Course Completed - Your Journey is Just Beginning!",
+        "💫 Course Completed - You’re Reaching New Heights!",
+        "🌟 Course Completed - You’re a Star in the Making!",
+        "🎓 Course Completed - Your Knowledge is Your Superpower!",
+        "🎉 Course Completed - You’re a Force to be Reckoned With!",
+        "💪 Course Completed - Your Strength is Unmatched!",
+        "💡 Course Completed - Keep Growing, Keep Shining!",
+        "🚀 Course Completed - The Sky is Not the Limit, It’s Just the Beginning!",
+        "🌟 Course Completed - Your Potential is Limitless!",
+        "🎉 Course Completed - Celebrate Your Success and Keep Moving Forward!",
+        "🏆 Course Completed - You’ve Earned Your Place Among the Best!",
+        "💪 Course Completed - Your Determination is Unstoppable!",
+    ]
+
+    useEffect(() => {
+        if (!course?.courseContents) return;
+        const completedLectures = course.courseContents.flatMap(content =>
+            content.courseLectures.filter(lecture => lecture.userCourseProgress.completed)
+        ) || [];
+
+        const totalLectures = course.courseContents.flatMap(content => content.courseLectures) || [];
+
+        setProgressPercentage(
+            Math.round((completedLectures.length / (totalLectures.length || 1)) * 100)
+        );
+    }, [course?.courseContents]);
 
     useEffect(() => {
@@ -27,7 +69,4 @@
     }, [courseId, accessToken]);
 
-    useEffect(() => {
-        console.log(activeLecture)
-    }, [activeLecture])
 
     useEffect(() => {
@@ -118,4 +157,5 @@
     return {
         course,
+        setCourse,
         activeLecture,
         setActiveLecture,
@@ -127,4 +167,8 @@
         triggerDownload,
         getPresignedUrl,
+        isLastLectureFinished,
+        setIsLastLectureFinished,
+        courseFinishedPunchlines,
+        progressPercentage
     };
 }
Index: frontend/src/hooks/useEnrolledCourses.tsx
===================================================================
--- frontend/src/hooks/useEnrolledCourses.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/hooks/useEnrolledCourses.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,54 @@
+import {useEffect, useState} from "react";
+import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
+import {fetchCoursesApi, fetchEnrolledCoursesApi} from "../api/courseApi.ts";
+import {useAuthContext} from "../context/AuthContext.tsx";
+import {useCourseStorage} from "../context/CourseStorage.ts";
+import type {CoursePreviewEnrolled} from "../models/javaObjects/CoursePreviewEnrolled.tsx";
+
+export function useEnrolledCourses() {
+    const {allCourses: allCoursesStorage, setAllCourses: setAllCoursesStorage} = useCourseStorage();
+    const {accessToken} = useAuthContext();
+    const [enrolledCourses, setEnrolledCourses] = useState<CoursePreviewEnrolled[]>([]);
+    const [allCourses, setAllCourses] = useState<CoursePreview[]>(allCoursesStorage || []);
+    const [loading, setLoading] = useState<boolean>(true);
+
+    useEffect(() => {
+        setLoading(true);
+        // Enrolled courses
+        fetchEnrolledCoursesApi(accessToken || "")
+            .then(data => {
+                setEnrolledCourses(data);
+            })
+            .catch(error => {
+                console.error("Failed to fetch enrolled courses:", error);
+            })
+            .finally(() => setLoading(false));
+
+        // All courses to get the users favorite courses
+        if (allCoursesStorage && allCoursesStorage.length > 0) {
+            return;
+        }
+        const storedCourses = sessionStorage.getItem("allCourses");
+        if (storedCourses) {
+            setAllCoursesStorage(JSON.parse(storedCourses));
+            setAllCourses(JSON.parse(storedCourses));
+            return;
+        }
+        fetchCoursesApi(accessToken || "")
+            .then(courses => {
+                setAllCoursesStorage(courses);
+                setAllCourses(courses);
+                sessionStorage.setItem("allCourses", JSON.stringify(courses));
+            })
+            .catch(err => {
+                console.error("Failed to fetch courses:", err);
+            })
+    }, [accessToken]);
+
+    return {
+        enrolledCourses,
+        setEnrolledCourses,
+        allCourses,
+        loading
+    }
+}
Index: frontend/src/layout/Footer.tsx
===================================================================
--- frontend/src/layout/Footer.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/layout/Footer.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,7 +1,9 @@
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
 import ShifterLogo from "../../public/Shifter-S2W-White-Transparent.png";
-import {Link} from "react-router-dom";
 import {useAuthContext} from "../context/AuthContext.tsx";
 import LinkedIn from "../assets/icons/LinkedIn.tsx";
 import Instagram from "../assets/icons/Instagram.tsx";
+import NavbarLink from "../components/NavbarLink.tsx";
 
 function Footer() {
@@ -28,22 +30,8 @@
                             <h3 className="text-white font-bold text-2xl mb-4">Services</h3>
 
-                            <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                <Link to="/mentoring" className="transition-all
-                                    duration-300 ease-in-out z-10">Mentoring</Link>
-                                <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                    rounded-full transition-all duration-300 ease-in-out"/>
-                            </div>
-                            <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                <Link to="/courses" className="transition-all
-                                    duration-300 ease-in-out z-10">Courses</Link>
-                                <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                    rounded-full transition-all duration-300 ease-in-out"/>
-                            </div>
-                            <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                <Link to="/academies" className="transition-all
-                                    duration-300 ease-in-out z-10">Academies</Link>
-                                <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                    rounded-full transition-all duration-300 ease-in-out"/>
-                            </div>
+                            <NavbarLink to={"/mentoring"} label={"Mentoring"}/>
+                            <NavbarLink to={"/consulting"} label={"Consulting"}/>
+                            <NavbarLink to={"/courses"} label={"Courses"}/>
+                            <NavbarLink to={"/academies"} label={"Academies"}/>
                         </section>
 
@@ -52,16 +40,5 @@
                             <h3 className="text-white font-bold text-2xl mb-4">About Us</h3>
 
-                            <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                <Link to="/about" className="transition-all
-                                    duration-300 ease-in-out z-10">About Shifter</Link>
-                                <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                    rounded-full transition-all duration-300 ease-in-out"/>
-                            </div>
-                            <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                <Link to="/experts" className="transition-all
-                                    duration-300 ease-in-out z-10">Experts</Link>
-                                <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                    rounded-full transition-all duration-300 ease-in-out"/>
-                            </div>
+                            <NavbarLink to={"/about"} label={"About Shifter"}/>
                         </section>
 
@@ -72,25 +49,17 @@
                             {user ?
                                 <>
-                                    <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                        <Link to="/profile" className="transition-all
-                                duration-300 ease-in-out z-10">Profile</Link>
-                                        <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                rounded-full transition-all duration-300 ease-in-out"/>
-                                    </div>
+                                    <NavbarLink to={"/profile"} label={"Profile"}/>
                                     <div className="flex flex-col gap-0 overflow-clip group w-fit">
                                         <button
                                             onClick={logout}
-                                            className="transition-all
-                                duration-300 ease-in-out z-10 cursor-pointer">Log Out</button>
+                                            className="transition-all duration-300 ease-in-out z-10 cursor-pointer"
+                                        >
+                                            Log Out
+                                        </button>
                                         <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                rounded-full transition-all duration-300 ease-in-out"/>
+                                            rounded-full transition-all duration-300 ease-in-out"/>
                                     </div>
                                 </> :
-                                <div className="flex flex-col gap-0 overflow-clip p-1 group w-fit">
-                                    <Link to="/login" className="transition-all
-                                duration-300 ease-in-out z-10">Log in / Sign up </Link>
-                                    <hr className="relative -left-40 group-hover:-left-4 border-t-2
-                                rounded-full transition-all duration-300 ease-in-out"/>
-                                </div>
+                                <NavbarLink to={"/login"} label={"Log In / Sign Up"}/>
                             }
                         </section>
@@ -102,16 +71,6 @@
                                 <h3 className="text-white font-bold text-2xl mb-4">Dashboard</h3>
 
-                                <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                    <Link to="/profile" className="transition-all
-                                duration-300 ease-in-out z-10">My Courses</Link>
-                                    <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                rounded-full transition-all duration-300 ease-in-out"/>
-                                </div>
-                                <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                    <Link to="/profile" className="transition-all
-                                duration-300 ease-in-out z-10">Favorite Courses</Link>
-                                    <hr className="relative -left-40 group-hover:-left-4 border-t-2
-                                rounded-full transition-all duration-300 ease-in-out"/>
-                                </div>
+                                <NavbarLink to={"/profile"} label={"Profile"}/>
+                                <NavbarLink to={"/learn"} label={"My Learning"}/>
                             </section>
                         }
Index: frontend/src/layout/Navbar.tsx
===================================================================
--- frontend/src/layout/Navbar.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/layout/Navbar.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -11,52 +11,52 @@
     return (
         <nav
-            className=" fixed top-2 z-50 w-11/12 left-1/2 -translate-x-1/2 flex items-center justify-between py-3 px-10 pr-0 rounded-full
-            border-3 border-white/30 bg-black/50 backdrop-blur-md text-white font-light overflow-clip"
+            className="fixed top-2 z-50 w-11/12 left-1/2 -translate-x-1/2 flex items-center justify-between py-2 rounded-full
+            border-3 border-white/30 bg-black/50 backdrop-blur-md text-white font-light overflow-clip gap-20"
         >
             {/* Left nav links */}
-            <div className="flex w-36/100 justify-between text-lg items-center">
+            <div className={`flex w-40/100 justify-between text-md items-center
+                                pl-10 ${user?.hasUsedFreeConsultation && "pl-12"}`}>
                 {/* Link group */}
                 <NavbarLink to="/courses" label="Courses"/>
                 <NavbarLink to="/mentoring" label="Mentoring"/>
+                <NavbarLink to="/consulting" label="Consulting"/>
                 <NavbarLink to="/academies" label="Academies"/>
             </div>
 
             {/* Centered Logo (NO ABSOLUTE!) */}
-            <div className="flex justify-center items-center w-fit px-20">
+            <div className="flex justify-center items-center w-fit">
                 <Link to="/">
-                    <img src={logo} alt="Shifter Logo" className="h-14"/>
+                    <img src={logo} alt="Shifter Logo" className="h-12"/>
                 </Link>
             </div>
 
             {/* Right nav links + profile */}
-            <div className="flex w-36/100 justify-between text-lg items-center gap-6">
+            <div className="flex w-40/100 justify-between text-md items-center gap-6">
                 <NavbarLink to="/about" label="About"/>
-                {user ? (
-                    <>
-                        <NavbarLink to="/learn" label="Dashboard"/>
-                        <div className="flex gap-4 items-center">
-                            <Link
-                                to="/profile"
-                                className="hover:bg-shifter transition-all duration-200 ease-in-out cursor-pointer
+                {
+                    user ?
+                        <NavbarLink to="/learn" label="My Learning"/> :
+                        <NavbarLink to="/login" label="Login / Register"/>
+                }
+                <div className="flex gap-4 items-center">
+                    {
+                        user &&
+                        <Link
+                            to="/profile"
+                            className="hover:bg-shifter transition-all duration-200 ease-in-out cursor-pointer
                                 h-full aspect-square rounded-full border-2 border-white/20 p-3 bg-shifter/40 text-white font-bold flex items-center justify-center"
-                            >
-                                {user.name.split(" ")[0].charAt(0).toUpperCase()}
-                            </Link>
-                            <Link
-                                to="/free-consultation"
-                                className="hover:-translate-x-2 transition-all duration-200 ease-in-out cursor-pointer
-                                relative -mr-4 px-6 pr-9 py-2 bg-shifter rounded-l-lg font-medium
-                                shadow-md shadow-shifter/30"
-                            >Free Consultation
-                            </Link>
-                        </div>
-                    </>
-                ) : (
-                    <Link to="/login"
-                          className="hover:-translate-x-4 transition-all duration-200 ease-in-out cursor-pointer
-                              relative -mr-4 px-6 pr-9 py-2 bg-shifter rounded-l-lg font-medium
-                              shadow-md shadow-shifter/30"
-                    >Login / Register</Link>
-                )}
+                        >
+                            {user.name.split(" ")[0].charAt(0).toUpperCase()}
+                        </Link>
+                    }
+                    <Link
+                        to={`${user?.hasUsedFreeConsultation ? "/contact" : "/free-consultation"}`}
+                        className={`hover:-translate-x-2 transition-all duration-200 ease-in-out cursor-pointer
+                                relative -mr-4 py-2 bg-shifter rounded-l-lg font-medium
+                                shadow-md shadow-shifter/30 px-8 pr-10 ${user?.hasUsedFreeConsultation && "px-10 pr-12"}`}
+                    >
+                        {user?.hasUsedFreeConsultation ? "Contact Us" : "Free Consultation"}
+                    </Link>
+                </div>
             </div>
         </nav>
Index: frontend/src/layout/NavbarLearn.tsx
===================================================================
--- frontend/src/layout/NavbarLearn.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/layout/NavbarLearn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -5,6 +5,14 @@
 import {fromUrlFormat} from "../utils/toUrlFormat.ts";
 import NavbarLink from "../components/NavbarLink.tsx";
+import StarFilled from "../assets/icons/StarFilled.tsx";
+import StarOutline from "../assets/icons/StarOutline.tsx";
+import {useState} from "react";
+import ModalReviewCourse from "../components/ModalReviewCourse.tsx";
 
-function NavbarLearn() {
+function NavbarLearn({courseRating, markCourseAsRated}: {
+    courseRating?: number;
+    markCourseAsRated: (rating: number) => void;
+}) {
+    const [showReviewModal, setShowReviewModal] = useState<boolean>(false);
     const location = useLocation();
     const courseId = location.pathname.split("/")[2] || "";
@@ -15,10 +23,24 @@
         <nav className="flex justify-between items-center bg-black w-full py-2 px-8 border-b-2 border-white/60">
             <div className="flex gap-4 items-center text-xl text-white ">
-                <Link to="/learn">
+                <Link to="/">
                     <img src={logo} alt="Shifter Logo" className="h-12"/>
                 </Link>
                 <div className="w-[1px] bg-white/40 self-stretch my-2"/>
                 {
-                    courseTitle && <Link to={`/courses/${courseId}/${courseTitleEncoded}`}>{courseTitle}</Link>
+                    courseTitle && <Link to={`/courses/${courseId}/${courseTitleEncoded}`}
+                                         className="hover:brightness-80">{courseTitle}</Link>
+                }
+                {
+                    courseRating !== null && courseRating !== undefined  && (
+                        <button
+                            onClick={() => setShowReviewModal(true)}
+                            className="flex gap-1 cursor-pointer hover:brightness-80"
+                        >
+                            {[1, 2, 3, 4, 5].map((star) => {
+                                const StarIcon = courseRating > 0 && star <= courseRating ? StarFilled : StarOutline;
+                                return <StarIcon key={star} className="w-4 text-yellow-400" />;
+                            })}
+                        </button>
+                    )
                 }
             </div>
@@ -26,8 +48,19 @@
             <div className="flex gap-4">
                 <NavbarLink className="w-fit text-white"
-                            to={"/learn"} label={"Dashboard"}/>
+                            to={"/learn"} label={"Learn"}/>
                 <NavbarLink className="w-fit text-white"
                             to={"/"} label={"Return Home"}/>
             </div>
+
+            {
+                showReviewModal && (
+                    <ModalReviewCourse
+                        courseId={+courseId}
+                        closeModal={() => setShowReviewModal(false)}
+                        markCourseAsRated={markCourseAsRated}
+                        isUpdate={true}
+                    />
+                )
+            }
         </nav>
     )
Index: frontend/src/models/Review.tsx
===================================================================
--- frontend/src/models/Review.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/models/Review.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,7 @@
+export interface Review {
+    id: number;
+    rating: number;
+    comment: string;
+    date: Date;
+    enrollmentId: number;
+}
Index: frontend/src/models/javaObjects/CourseFull.tsx
===================================================================
--- frontend/src/models/javaObjects/CourseFull.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/models/javaObjects/CourseFull.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,22 +1,10 @@
-import type {Difficulty} from "../types/Difficulty.tsx";
 import type {CourseContentFull} from "./CourseContentFull.tsx";
 
 export interface CourseFull {
     id: number,
-    imageUrl: string;
-    color: string;
     titleShort: string;
     title: string;
-    difficulty: Difficulty;
-    durationMinutes: number;
-    price: number;
     rating: number;
-    ratingCount: number;
-    descriptionShort: string;
-    description: string;
-    descriptionLong: string;
-    whatWillBeLearned: string[];
-    skillsGained: string[];
-    topicsCovered: string[];
+    isFinished: boolean;
     courseContents: CourseContentFull[];
 }
Index: frontend/src/models/javaObjects/CoursePreview.tsx
===================================================================
--- frontend/src/models/javaObjects/CoursePreview.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/models/javaObjects/CoursePreview.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -10,9 +10,9 @@
     durationMinutes: number;
     price: number;
-    rating: number;
-    ratingCount: number;
     skillsGained: string[];
     topicsCovered: string[];
     courseContentCount: number;
+    courseLectureCount: number;
+    averageRating: number;
 }
 
Index: frontend/src/models/javaObjects/CoursePreviewEnrolled.tsx
===================================================================
--- frontend/src/models/javaObjects/CoursePreviewEnrolled.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/models/javaObjects/CoursePreviewEnrolled.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,8 @@
+import type {CoursePreview} from "./CoursePreview.tsx";
+
+export interface CoursePreviewEnrolled extends CoursePreview {
+    lecturesFinishedCount: number;
+    rating: number;
+    isFinished: boolean;
+}
+
Index: frontend/src/models/javaObjects/User.tsx
===================================================================
--- frontend/src/models/javaObjects/User.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/models/javaObjects/User.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -4,5 +4,5 @@
     name: string;
     hasUsedFreeConsultation: boolean;
-    companyType: string;
+    companySize: string;
     workPosition: string;
     interests: string[];
Index: frontend/src/models/javaObjects/UserRegister.tsx
===================================================================
--- frontend/src/models/javaObjects/UserRegister.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/models/javaObjects/UserRegister.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -5,5 +5,5 @@
     name: string;
     workPosition: string;
-    companyType: string;
+    companySize: string;
     interests: string[];
     desiredSkills: string[];
Index: frontend/src/pages/About.tsx
===================================================================
--- frontend/src/pages/About.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/About.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,188 @@
+import HeroAbout from "../components/HeroAbout.tsx";
+import {
+    IconArrowBigUpFilled,
+    IconChessKnightFilled,
+    IconTrendingUp,
+    IconRotate360,
+    IconRoute, IconTarget, IconRocket, IconTelescope, IconChessKnight, IconArrowBigUp
+} from '@tabler/icons-react';
+import {LightBeams} from "../assets/animations/SpikeAnimation.tsx"
+import CountUp from "react-countup";
+import {Link} from "react-router-dom";
+import {ArrowRight} from "lucide-react";
+import MagicBento from "../assets/animations/MagicBento.tsx";
+import ShifterArrow from "../../public/Shifter-Arrow-White.png"
+
+const reasons = [
+    {
+        icon: <IconChessKnight size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
+        title: "Tailored Strategies",
+        description: "Strategies and programs designed specifically for your business goals and challenges.",
+    },
+    {
+        icon: <IconArrowBigUp size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
+        title: "Empowering Clients",
+        description: "Teaching clients how to solve challenges independently, not just provide ready-made solutions.",
+    },
+    {
+        icon: <IconRotate360 size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
+        title: "Holistic Approach",
+        description: "A comprehensive method that addresses root causes across your business, not just the symptoms.",
+    },
+    {
+        icon: <IconTrendingUp size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
+        title: "Sustainable Growth",
+        description: "Strategic solutions that strengthen processes, teams, and systems for long-term success.",
+    },
+    {
+        icon: <IconRoute size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
+        title: "Expert Guidance",
+        description: "Solutions from professionals who make business challenges manageable.",
+    }
+];
+
+function About() {
+    return (
+        <main className="relative bg-beige text-black-text">
+            {/*Hero Section*/}
+            <section className="relative py-vertical-lg pt-top-nav-lg px-horizontal-md
+                        flex flex-col items-center justify-center">
+                <LightBeams/>
+
+                <div className="flex flex-col items-center gap-20 z-1">
+                    <div className="flex flex-col  gap-4 max-w-3/4">
+                        <h1 className="text-7xl font-semibold ">Business Development & Transformation
+                            Center</h1>
+                        <p className="text-xl font-light ">
+                            <span className="font-semibold">Shifter</span> is a center for business development and
+                            transformation,
+                            offering mentorship, consulting, academies, and e-learning for family businesses.
+                        </p>
+                    </div>
+                    <div className="flex justify-evenly items-stretch w-full">
+                        <div>
+                            <h2 className="text-3xl font-bold text"><CountUp start={0} end={250} duration={4}
+                                                                             separator={"."}/>+</h2>
+                            <p className="font-light whitespace-nowrap">Clients Empowered</p>
+                        </div>
+
+                        <div className="w-px  bg-beige/80"/>
+
+                        <div>
+                            <h2 className="text-3xl font-bold text"><CountUp start={0} end={2000} duration={4}
+                                                                             separator={"."}/>+</h2>
+                            <p className="font-light whitespace-nowrap">Mentoring Hours</p>
+                        </div>
+
+                        <div className="w-px bg-beige/80"/>
+
+                        <div>
+                            <h2 className="text-3xl font-bold text"><CountUp start={0} end={4} duration={4}
+                                                                             separator={"."}/>+</h2>
+                            <p className="font-light whitespace-nowrap">Years of Shifter</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div
+                    className="absolute bottom-0 w-full h-3/10"
+                    style={{
+                        background: "linear-gradient(to bottom, rgba(248,248,248,0) 0%, rgba(248,248,248,1) 100%)",
+                        pointerEvents: "none", // allows clicks to pass through
+                    }}
+                />
+            </section>
+
+            {/*Why Choose Us*/}
+            <section className="grid grid-cols-3 grid-rows-2 px-horizontal-md py-vertical-lg gap-20">
+                <div className="col-span-1 flex flex-col">
+                    <h2 className="text-5xl font-medium text-left ">
+                        Why choose <br/> <span className="font-bold text-shifter">Shifter?</span>
+                    </h2>
+                </div>
+
+                {reasons.map((reason, index) => (
+                    <article key={index} className="col-span-1 flex flex-col gap-6 items-center">
+                        {reason.icon}
+                        <div className="flex flex-col gap-2 items-center">
+                            <h3 className="text-3xl font-bold">{reason.title}</h3>
+                            <p className="text-black-text/60">{reason.description}</p>
+                        </div>
+                    </article>
+                ))}
+            </section>
+
+            {/*About Section*/}
+            <section className="grid grid-cols-2 gap-x-40 px-horizontal-md py-vertical-lg bg-dark-blue/5">
+
+                <div className="col-start-1 col-span-1 flex flex-col text-left gap-12">
+                    <div className="flex flex-col gap-20">
+                        <div className="flex flex-col gap-4">
+                            <h2 className="text-5xl font-medium">About <span
+                                className="text-shifter font-black">Shifter</span></h2>
+                            <p>
+                                Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum
+                                has been the
+                                industry's standard dummy text ever since the 1500s, when an unknown printer took a
+                                galley of type
+                                and scrambled it to make a type specimen book. It has survived not only five centuries,
+                                but also the
+                                leap into electronic typesetting, remaining essentially unchanged. It was popularised in
+                                the 1960s
+                                with the release of Letraset sheets containing Lorem Ipsum passages, and more recently
+                                with desktop
+                                publishing software like Aldus PageMaker including versions of Lorem Ipsum.
+                            </p>
+                        </div>
+
+                        <Link to={"/free-consultation"}
+                              className="hover:shadow-shifter/60 shadow-shifter/40 transition-all duration-250 ease-in-out
+                              shadow-md border-2 border-white/40 flex gap-4 items-center
+                              text-white bg-shifter px-8 py-2 w-fit rounded-md group font-medium">
+                            Book a Free Consultation
+                            <ArrowRight size={20} strokeWidth={1.5} className="group-hover:translate-x-1 transition-all duration-250 ease-in-out" />
+                        </Link>
+                    </div>
+                </div>
+
+                <div className="col-start-2 col-span-1 h-full bg-black/20 rounded-2xl"/>
+            </section>
+
+            {/*Mission, Vision & Purpose*/}
+            <section className="flex flex-col gap-12 px-horizontal-md py-vertical-lg bg-dark-blue/5">
+                <h2 className="text-5xl font-medium">Our Foundations</h2>
+                <MagicBento
+                    textAutoHide={true}
+                    enableStars={false}
+                    enableSpotlight={true}
+                    enableBorderGlow={true}
+                    enableTilt={true}
+                    enableMagnetism={true}
+                    clickEffect={false}
+                    spotlightRadius={300}
+                />
+            </section>
+
+            <section className="py-vertical-sm bg-dark-blue/5">
+                <div className="relative border-2 border-white/40 shadow-md shadow-shifter/40
+                flex justify-between items-end overflow-clip
+                px-horizontal-sm py-vertical-md pt-top-nav-lg mx-horizontal-md bg-shifter rounded-xl text-left">
+                    <h2 className="text-5xl text-white">Simplify Your Growth <br/> Journey</h2>
+                    <Link to={"/free-consultation"}
+                          className="z-1 hover:shadow-white/60 shadow-white/40 transition-all duration-250 ease-in-out
+                              shadow-md border-2 border-black/10 flex gap-4 items-center
+                              text-shifter bg-beige px-4 py-2 w-fit rounded-md font-bold">
+                        Book a Free Consultation
+                    </Link>
+
+                    <img src={ShifterArrow} alt={"Shifter Arrow"}
+                        aria-hidden={true}
+                         className="absolute right-0 -bottom-20 rotate-45 w-60 opacity-20"
+                    />
+                </div>
+            </section>
+        </main>
+    );
+}
+
+export default About;
Index: frontend/src/pages/Academies.tsx
===================================================================
--- frontend/src/pages/Academies.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Academies.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,190 @@
+import {Instagram, Linkedin, Mail, MapPin} from "lucide-react"
+import React from "react";
+import {useAuthContext} from "../context/AuthContext.tsx";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import Arrow from "../../public/Shifter-Arrow-White.png"
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
+import NavbarLink from "../components/NavbarLink.tsx";
+import {sendEmailApi} from "../api/contactApi.ts";
+
+function Academies() {
+    const {user, accessToken} = useAuthContext();
+    const [subject, setSubject] = React.useState("");
+    const [message, setMessage] = React.useState("");
+    const [loading, setLoading] = React.useState(false);
+
+    const handleSubmit = (e: React.FormEvent) => {
+        e.preventDefault();
+        // Handle form submission logic here
+        console.log("Subject:", subject);
+        console.log("Message:", message);
+
+        setLoading(true);
+        sendEmailApi(accessToken || "", "Mentoring: " + subject, message)
+            .then(() => {
+                console.log("Successfully sent email");
+            })
+            .catch((err) => {
+                console.error("Error sending email:", err);
+            })
+            .finally(() => setLoading(false));
+    }
+
+    return (
+        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
+            {/*Hero*/}
+            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg
+                text-white-text">
+                <h1 className="text-5xl font-bold">Transform Your Team's Expertise with Corporate Group Academies & Training</h1>
+                <p className="text-xl font-light">
+                    Transform your team into a synchronized unit of high-performers.
+                    Our Group Academies deliver <strong className="font-bold">standardized, expert-led training</strong> to rapidly upskill entire departments,
+                    close knowledge gaps, and drive consistent execution across your organization.
+                    Inquire now to secure a personalized curriculum review for your business.
+                </p>
+            </section>
+
+
+            {/*Contact Form*/}
+            <section className=" flex items-center justify-center w-full px-horizontal-lg">
+                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4
+                    shadow-md shadow-black/10">
+
+                    {/*Contact Info*/}
+                    <div className="border-1 border-white/40
+                    relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
+                        <div className="flex flex-col gap-2 items-start text-left">
+                            <h2 className="text-2xl font-semibold whitespace-nowrap">Contact Information</h2>
+                            <p className="text-white/80 font-light text-sm">
+                                Complete the form and our team will respond shortly to help you take the next step.
+                            </p>
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <Mail size={24} color="var(--color-white)" />
+                            contact@shift-er.com
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <MapPin size={24} color="var(--color-white)" />
+                            Skopje, N. Macedonia
+                        </div>
+
+                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
+                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow" />
+                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow" />
+                        </div>
+                    </div>
+
+                    {/*Form*/}
+                    <div className="flex flex-col gap-4 col-span-2">
+                        <div className="flex justify-betwee gap-20 items-center">
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Name: <span
+                                className="text-black-text font-normal">{user?.name}</span></p>
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Email: <span
+                                className="text-black-text font-normal">{user?.email}</span></p>
+                            <p className="text-black/40 text-sm col-span-2">
+                                These values are automatically populated from your profile.
+                                If any of them are incorrect, please update them in the Profile page.
+                            </p>
+                        </div>
+
+                        <hr className="border-t-2 border-black/20"/>
+
+                        <form
+                            onSubmit={handleSubmit}
+                            className="flex flex-col gap-4 items-start">
+                            <TextInput
+                                label="Your Subject"
+                                name="subject"
+                                placeholder="Enter the subject of your message"
+                                rows={1}
+                                onChange={(e) => setSubject(e.target.value)}
+                            />
+                            <TextInput
+                                label="Message"
+                                name="message"
+                                placeholder="Write your message here..."
+                                rows={8}
+                                onChange={(e) => setMessage(e.target.value)}
+                            />
+                            <div className="flex items-center gap-6">
+                                <button
+                                    className="hover:shadow-shifter/40 transition-all duration-200 ease-in-out
+                                    disabled:cursor-not-allowed disabled:opacity-60
+                                    shadow-md shadow-shifter/20 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
+                                    disabled={loading}
+                                    type="submit">
+                                    {loading ? "Sending..." : "Send Message"}
+                                </button>
+                                {
+                                    loading && <div className="loader" />
+                                }
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </section>
+
+            <footer className="flex justify-between px-horizontal-lg py-vertical-sm ">
+                <img src={ShifterLogo} alt="Shifter - Business Consulting, Mentoring & Online Courses Logo"
+                     className="h-12"
+                />
+
+                <div className="flex gap-4 items-center">
+                    <NavbarLink to={"/mentoring"} label={"Mentoring"} className="text-sm"/>
+                    <NavbarLink to={"/consulting"} label={"Consulting"} className="text-sm"/>
+                    <NavbarLink to={"/courses"} label={"Courses"} className="text-sm"/>
+                    <NavbarLink to={"/academies"} label={"Academies"} className="text-sm"/>
+                </div>
+
+                <div className="flex gap-4 ">
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Linkedin size={20} color="var(--color-shifter)"/>
+                    </a>
+
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Instagram size={20} color="var(--color-shifter)"/>
+                    </a>
+                </div>
+            </footer>
+        </main>
+    )
+}
+
+
+function TextInput({label, name, placeholder, rows, onChange}: {
+    label: string;
+    name: string;
+    placeholder: string;
+    rows: number;
+    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
+}) {
+    return (
+        <label className="w-full flex flex-col items-start gap-2">
+            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
+            <textarea
+                onChange={onChange}
+                rows={rows}
+                name={name}
+                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm
+                resize-none min-h-fit custom-scrollbar
+                focus:outline-none focus:border-shifter/40 focus:border-2"
+                placeholder={placeholder}
+            />
+        </label>
+    )
+}
+
+export default Academies
Index: frontend/src/pages/Consulting.tsx
===================================================================
--- frontend/src/pages/Consulting.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Consulting.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,190 @@
+import {Instagram, Linkedin, Mail, MapPin} from "lucide-react"
+import React from "react";
+import {useAuthContext} from "../context/AuthContext.tsx";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import Arrow from "../../public/Shifter-Arrow-White.png"
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
+import NavbarLink from "../components/NavbarLink.tsx";
+import {sendEmailApi} from "../api/contactApi.ts";
+
+function Consulting() {
+    const {user, accessToken} = useAuthContext();
+    const [subject, setSubject] = React.useState("");
+    const [message, setMessage] = React.useState("");
+    const [loading, setLoading] = React.useState(false);
+
+    const handleSubmit = (e: React.FormEvent) => {
+        e.preventDefault();
+        // Handle form submission logic here
+        console.log("Subject:", subject);
+        console.log("Message:", message);
+
+        setLoading(true);
+        sendEmailApi(accessToken || "", "Mentoring: " + subject, message)
+            .then(() => {
+                console.log("Successfully sent email");
+            })
+            .catch((err) => {
+                console.error("Error sending email:", err);
+            })
+            .finally(() => setLoading(false));
+    }
+
+    return (
+        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
+            {/*Hero*/}
+            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg
+                text-white-text">
+                <h1 className="text-5xl font-bold">Dedicated 1:1 Strategic Consulting</h1>
+                <p className="text-xl font-light">
+                    Our consulting engagement ensures maximum client results by operating with <strong className="font-bold">limited openings. </strong>
+                    This guarantees that every client receives the <strong className="font-bold">undivided attention</strong> and continuous strategic
+                    execution necessary to deliver <strong className="font-bold">measurable outcomes. </strong>
+                    Submit your inquiry to begin the qualification process for exclusive strategic support.
+                </p>
+            </section>
+
+
+            {/*Contact Form*/}
+            <section className=" flex items-center justify-center w-full px-horizontal-lg">
+                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4
+                    shadow-md shadow-black/10">
+
+                    {/*Contact Info*/}
+                    <div className="border-1 border-white/40
+                    relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
+                        <div className="flex flex-col gap-2 items-start text-left">
+                            <h2 className="text-2xl font-semibold whitespace-nowrap">Contact Information</h2>
+                            <p className="text-white/80 font-light text-sm">
+                                Complete the form and our team will respond shortly to help you take the next step.
+                            </p>
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <Mail size={24} color="var(--color-white)" />
+                            contact@shift-er.com
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <MapPin size={24} color="var(--color-white)" />
+                            Skopje, N. Macedonia
+                        </div>
+
+                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
+                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow" />
+                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow" />
+                        </div>
+                    </div>
+
+                    {/*Form*/}
+                    <div className="flex flex-col gap-4 col-span-2">
+                        <div className="flex justify-betwee gap-20 items-center">
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Name: <span
+                                className="text-black-text font-normal">{user?.name}</span></p>
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Email: <span
+                                className="text-black-text font-normal">{user?.email}</span></p>
+                            <p className="text-black/40 text-sm col-span-2">
+                                These values are automatically populated from your profile.
+                                If any of them are incorrect, please update them in the Profile page.
+                            </p>
+                        </div>
+
+                        <hr className="border-t-2 border-black/20"/>
+
+                        <form
+                            onSubmit={handleSubmit}
+                            className="flex flex-col gap-4 items-start">
+                            <TextInput
+                                label="Your Subject"
+                                name="subject"
+                                placeholder="Enter the subject of your message"
+                                rows={1}
+                                onChange={(e) => setSubject(e.target.value)}
+                            />
+                            <TextInput
+                                label="Message"
+                                name="message"
+                                placeholder="Write your message here..."
+                                rows={8}
+                                onChange={(e) => setMessage(e.target.value)}
+                            />
+                            <div className="flex items-center gap-6">
+                                <button
+                                    className="hover:shadow-shifter/40 transition-all duration-200 ease-in-out
+                                    disabled:cursor-not-allowed disabled:opacity-60
+                                    shadow-md shadow-shifter/20 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
+                                    disabled={loading}
+                                    type="submit">
+                                    {loading ? "Sending..." : "Send Message"}
+                                </button>
+                                {
+                                    loading && <div className="loader" />
+                                }
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </section>
+
+            <footer className="flex justify-between px-horizontal-lg py-vertical-sm ">
+                <img src={ShifterLogo} alt="Shifter - Business Consulting, Mentoring & Online Courses Logo"
+                     className="h-12"
+                />
+
+                <div className="flex gap-4 items-center">
+                    <NavbarLink to={"/mentoring"} label={"Mentoring"} className="text-sm"/>
+                    <NavbarLink to={"/consulting"} label={"Consulting"} className="text-sm"/>
+                    <NavbarLink to={"/courses"} label={"Courses"} className="text-sm"/>
+                    <NavbarLink to={"/academies"} label={"Academies"} className="text-sm"/>
+                </div>
+
+                <div className="flex gap-4 ">
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Linkedin size={20} color="var(--color-shifter)"/>
+                    </a>
+
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Instagram size={20} color="var(--color-shifter)"/>
+                    </a>
+                </div>
+            </footer>
+        </main>
+    )
+}
+
+
+function TextInput({label, name, placeholder, rows, onChange}: {
+    label: string;
+    name: string;
+    placeholder: string;
+    rows: number;
+    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
+}) {
+    return (
+        <label className="w-full flex flex-col items-start gap-2">
+            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
+            <textarea
+                onChange={onChange}
+                rows={rows}
+                name={name}
+                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm
+                resize-none min-h-fit custom-scrollbar
+                focus:outline-none focus:border-shifter/40 focus:border-2"
+                placeholder={placeholder}
+            />
+        </label>
+    )
+}
+
+export default Consulting
Index: frontend/src/pages/Contact.tsx
===================================================================
--- frontend/src/pages/Contact.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Contact.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,187 @@
+import {Instagram, Linkedin, Mail, MapPin} from "lucide-react"
+import React from "react";
+import {useAuthContext} from "../context/AuthContext.tsx";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import Arrow from "../../public/Shifter-Arrow-White.png"
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
+import NavbarLink from "../components/NavbarLink.tsx";
+import {sendEmailApi} from "../api/contactApi.ts";
+
+function Contact() {
+    const {user, accessToken} = useAuthContext();
+    const [subject, setSubject] = React.useState("");
+    const [message, setMessage] = React.useState("");
+    const [loading, setLoading] = React.useState(false);
+
+    const handleSubmit = (e: React.FormEvent) => {
+        e.preventDefault();
+        // Handle form submission logic here
+        console.log("Subject:", subject);
+        console.log("Message:", message);
+
+        setLoading(true);
+        sendEmailApi(accessToken || "", subject, message)
+            .then(() => {
+                console.log("Successfully sent email");
+            })
+            .catch((err) => {
+                console.error("Error sending email:", err);
+            })
+            .finally(() => setLoading(false));
+    }
+
+    return (
+        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
+            {/*Hero*/}
+            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg
+                text-white-text">
+                <h1 className="text-5xl font-bold">Transform Your Vision into Results</h1>
+                <p className="text-xl font-light">
+                    Complete the form and our team will respond shortly to help you take the next step.
+                </p>
+            </section>
+
+
+            {/*Contact Form*/}
+            <section className=" flex items-center justify-center w-full px-horizontal-lg">
+                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4
+                    shadow-md shadow-black/10">
+
+                    {/*Contact Info*/}
+                    <div className="border-1 border-white/40
+                    relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
+                        <div className="flex flex-col gap-2 items-start text-left">
+                            <h2 className="text-2xl font-semibold whitespace-nowrap">Contact Information</h2>
+                            <p className="text-white/80 font-light text-sm">
+                                Complete the form and our team will respond shortly to help you take the next step.
+                            </p>
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <Mail size={24} color="var(--color-white)" />
+                            contact@shift-er.com
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <MapPin size={24} color="var(--color-white)" />
+                            Skopje, N. Macedonia
+                        </div>
+
+                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
+                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow" />
+                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow" />
+                        </div>
+                    </div>
+
+                    {/*Form*/}
+                    <div className="flex flex-col gap-4 col-span-2">
+                        <div className="flex justify-betwee gap-20 items-center">
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Name: <span
+                                className="text-black-text font-normal">{user?.name}</span></p>
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Email: <span
+                                className="text-black-text font-normal">{user?.email}</span></p>
+                            <p className="text-black/40 text-sm col-span-2">
+                                These values are automatically populated from your profile.
+                                If any of them are incorrect, please update them in the Profile page.
+                            </p>
+                        </div>
+
+                        <hr className="border-t-2 border-black/20"/>
+
+                        <form
+                            onSubmit={handleSubmit}
+                            className="flex flex-col gap-4 items-start">
+                            <TextInput
+                                label="Your Subject"
+                                name="subject"
+                                placeholder="Enter the subject of your message"
+                                rows={1}
+                                onChange={(e) => setSubject(e.target.value)}
+                            />
+                            <TextInput
+                                label="Message"
+                                name="message"
+                                placeholder="Write your message here..."
+                                rows={8}
+                                onChange={(e) => setMessage(e.target.value)}
+                            />
+                            <div className="flex items-center gap-6">
+                                <button
+                                    className="hover:shadow-shifter/40 transition-all duration-200 ease-in-out
+                                    disabled:cursor-not-allowed disabled:opacity-60
+                                    shadow-md shadow-shifter/20 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
+                                    disabled={loading}
+                                    type="submit">
+                                    {loading ? "Sending..." : "Send Message"}
+                                </button>
+                                {
+                                    loading && <div className="loader" />
+                                }
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </section>
+
+            <footer className="flex justify-between px-horizontal-lg py-vertical-sm ">
+                <img src={ShifterLogo} alt="Shifter - Business Consulting, Mentoring & Online Courses Logo"
+                     className="h-12"
+                />
+
+                <div className="flex gap-4 items-center">
+                    <NavbarLink to={"/mentoring"} label={"Mentoring"} className="text-sm"/>
+                    <NavbarLink to={"/consulting"} label={"Consulting"} className="text-sm"/>
+                    <NavbarLink to={"/courses"} label={"Courses"} className="text-sm"/>
+                    <NavbarLink to={"/academies"} label={"Academies"} className="text-sm"/>
+                </div>
+
+                <div className="flex gap-4 ">
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Linkedin size={20} color="var(--color-shifter)"/>
+                    </a>
+
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Instagram size={20} color="var(--color-shifter)"/>
+                    </a>
+                </div>
+            </footer>
+        </main>
+    )
+}
+
+
+function TextInput({label, name, placeholder, rows, onChange}: {
+    label: string;
+    name: string;
+    placeholder: string;
+    rows: number;
+    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
+}) {
+    return (
+        <label className="w-full flex flex-col items-start gap-2">
+            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
+            <textarea
+                onChange={onChange}
+                rows={rows}
+                name={name}
+                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm
+                resize-none min-h-fit custom-scrollbar
+                focus:outline-none focus:border-shifter/40 focus:border-2"
+                placeholder={placeholder}
+            />
+        </label>
+    )
+}
+
+export default Contact
Index: frontend/src/pages/CourseLearn.tsx
===================================================================
--- frontend/src/pages/CourseLearn.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/pages/CourseLearn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,10 +1,13 @@
-import {useParams} from "react-router-dom";
+import {Link, useParams} from "react-router-dom";
 import {useAuthContext} from "../context/AuthContext.tsx";
 import CourseContentSideNav from "../components/learn/CourseContentSideNav.tsx";
 import CourseLearnSkeleton from "../components/skeletons/CourseLearnSkeleton.tsx";
-import {ArrowLeft, MoveLeft, MoveRight} from "lucide-react";
+import {ArrowLeft, MoveLeft, MoveRight, CheckCheck} from "lucide-react";
 import TextWithUnderline from "../components/TextWithUnderline.tsx";
 import {useCourseLearn} from "../hooks/useCourseLearn.tsx";
-import {useEffect, useRef, useState} from "react";
+import {type JSX, useEffect, useRef, useState} from "react";
+import StarFilled from "../assets/icons/StarFilled.tsx";
+import NavbarLearn from "../layout/NavbarLearn.tsx";
+import ModalReviewCourse from "../components/ModalReviewCourse.tsx";
 
 function CourseLearn() {
@@ -12,8 +15,10 @@
     const {accessToken} = useAuthContext();
     const [showSideNav, setShowSideNav] = useState(true);
+    const [showReviewModal, setShowReviewModal] = useState(false);
     const {
         activeLecture,
         setActiveLecture,
         course,
+        setCourse,
         loading,
         videoUrl,
@@ -21,8 +26,17 @@
         updateLecture,
         triggerDownload,
+        isLastLectureFinished,
+        setIsLastLectureFinished,
+        courseFinishedPunchlines,
+        progressPercentage
     } = useCourseLearn(Number(courseId), accessToken || "");
     const spanRef = useRef<HTMLSpanElement>(null);
     const [spanWidth, setSpanWidth] = useState(0);
     const [isBtnHovered, setIsBtnHovered] = useState(false);
+
+    const firstLectureId = course?.courseContents[0].courseLectures[0].id;
+    const allLectures = course?.courseContents.flatMap(content => content.courseLectures);
+    const lastLectureId = allLectures ? allLectures[allLectures.length - 1].id : undefined;
+
 
     useEffect(() => {
@@ -39,133 +53,224 @@
     }, [activeLecture]);
 
+    const markCourseAsRated = (newRating: number) => {
+        if (!course) return;
+        setCourse({...course, rating: newRating})
+    }
 
     if (loading) {
         return (
-            <CourseLearnSkeleton/>
+            <>
+                <NavbarLearn courseRating={0} markCourseAsRated={markCourseAsRated}/>
+                <CourseLearnSkeleton/>
+            </>
         );
     }
 
-    const firstLectureId = course?.courseContents[0].courseLectures[0].id;
-    const allLectures = course?.courseContents.flatMap(content => content.courseLectures);
-    const lastLectureId = allLectures ? allLectures[allLectures.length - 1].id : undefined;
-
     return (
-        <main className="flex relative overflow-x-clip">
-            <div className="flex flex-col">
-                {
-                    activeLecture?.contentType === "VIDEO" && (
-                        <video
-                            src={videoUrl}
-                            controls
-                            controlsList="nodownload"
-                            preload="metadata"
+        <>
+            <NavbarLearn courseRating={course?.rating} markCourseAsRated={markCourseAsRated}/>
+            <main className="flex overflow-x-clip">
+                {
+                    isLastLectureFinished ? (
+                        <div className="flex flex-col gap-12 w-full justify-center items-center h-screen ">
+                            {
+                                progressPercentage !== 100 ? (
+                                    <LastLectureFinished
+                                        title={"🎉 You've finished the last lesson in this course!"}
+                                        onClick={() => {
+                                            const firstUncompletedLecture = course?.courseContents
+                                                ?.flatMap(content => content.courseLectures)
+                                                ?.find(lecture => !lecture.userCourseProgress.completed);
+                                            setActiveLecture(firstUncompletedLecture || course?.courseContents[0]?.courseLectures[0] || null);
+                                            setIsLastLectureFinished(false);
+                                        }}
+                                        btnText={"Finish Other Lectures"}
+                                        btnShow={true}
+                                    />
+                                ) : (
+                                    <LastLectureFinished
+                                        title={courseFinishedPunchlines[Math.floor(Math.random() * courseFinishedPunchlines.length)]}
+                                        onClick={() => {
+                                            setShowReviewModal(true);
+                                        }}
+                                        btnText={<>
+                                            <StarFilled className="text-gold h-6 "/>
+                                            Leave a Review
+                                        </>}
+                                        btnShow={(course?.rating ?? 0) === 0}
+                                    />
+                                )
+                            }
+                        </div>
+                    ) : (
+                        <div className="flex flex-col">
+                            {
+                                activeLecture?.contentType === "VIDEO" && (
+                                    <video
+                                        src={videoUrl}
+                                        controls
+                                        controlsList="nodownload"
+                                        preload="metadata"
+                                    />
+                                )
+                            }
+                            <div
+                                className="flex flex-col gap-4 flex-grow py-vertical-md px-horizontal-sm text-left text-black-text">
+                                <h1 className="text-4xl font-semibold">{activeLecture?.title}</h1>
+                                <p className="text-lg leading-loose">{activeLecture?.contentText}</p>
+                                {
+                                    (activeLecture?.contentType === "FILE" || activeLecture?.contentType === "TOOL" || activeLecture?.contentType === "QUIZ") && (
+                                        <div className="flex justify-between w-full gap-20 items-center py-12">
+                                            <p className="text-lg font-medium">
+                                                {activeLecture.contentFileName}
+                                            </p>
+                                            <button
+                                                disabled={isDownloading}
+                                                onClick={() => triggerDownload()}
+                                                className={`disabled:cursor-not-allowed disabled:opacity-40 hover:shadow-lg transition-all duration-300 ease-in-out cursor-pointer
+                                    bg-shifter text-white text-lg px-8 py-2 rounded-md shadow-md border-2 border-white/40 shadow-shifter/40`}
+                                            >
+                                                {
+                                                    isDownloading ? "Downloading..." : "Download File"
+                                                }
+                                            </button>
+                                        </div>
+                                    )
+                                }
+                            </div>
+
+                            <div className="px-horizontal-sm py-vertical-md w-full flex justify-between items-center">
+                                {
+                                    firstLectureId !== activeLecture?.id && (
+                                        <button
+                                            onClick={() => {
+                                                if (!course || !activeLecture) return;
+                                                const allLectures = course.courseContents.flatMap(content => content.courseLectures);
+                                                const currentIndex = allLectures.findIndex(lec => lec.id === activeLecture.id);
+                                                if (currentIndex > 0) {
+                                                    setActiveLecture(allLectures[currentIndex - 1]);
+                                                }
+                                            }}
+                                            className="mr-auto flex items-center gap-2 text-lg cursor-pointer py-2">
+                                            <MoveLeft size={20} strokeWidth={2}/>
+                                            <TextWithUnderline label={"Previous Lecture"} fromRightToLeft={true}/>
+                                        </button>
+                                    )
+                                }
+                                {
+                                    lastLectureId === activeLecture?.id ? (
+                                        <button
+                                            onClick={() => {
+                                                updateLecture(activeLecture?.userCourseProgress.id || -1, true);
+                                                setIsLastLectureFinished(true);
+                                            }}
+                                            className="ml-auto flex items-center gap-2 text-lg cursor-pointer py-2">
+                                            <TextWithUnderline label={"Finish Course"}/>
+                                            <CheckCheck size={20} strokeWidth={2}/>
+                                        </button>
+                                    ) : (
+                                        <button
+                                            onClick={() => {
+                                                updateLecture(activeLecture?.userCourseProgress.id || -1, true)
+                                                if (!course || !activeLecture) return;
+                                                const allLectures = course.courseContents.flatMap(content => content.courseLectures);
+                                                const currentIndex = allLectures.findIndex(lec => lec.id === activeLecture.id);
+                                                if (currentIndex < allLectures.length - 1) {
+                                                    setActiveLecture(allLectures[currentIndex + 1]);
+                                                }
+                                            }}
+                                            className="ml-auto flex items-center gap-2 text-lg cursor-pointer py-2">
+                                            <TextWithUnderline label={"Next Lecture"}/>
+                                            <MoveRight size={20} strokeWidth={2}/>
+                                        </button>
+                                    )
+                                }
+                            </div>
+                        </div>
+                    )
+                }
+                {
+                    activeLecture && course && showSideNav ? (
+                        <CourseContentSideNav
+                            activeLecture={activeLecture}
+                            setActiveLecture={setActiveLecture}
+                            courseContents={course.courseContents}
+                            updateLecture={updateLecture}
+                            closeModal={() => setShowSideNav(false)}
+                            progressPercentage={progressPercentage}
+                        />
+                    ) : (
+                        <button
+                            onMouseEnter={() => setIsBtnHovered(true)}
+                            onMouseLeave={() => setIsBtnHovered(false)}
+                            onClick={() => {
+                                setShowSideNav(true)
+                                setIsBtnHovered(false)
+                            }}
+                            className="fixed top-24 right-0 flex items-center gap-2
+                        h-fit bg-shifter px-4 py-2 border border-white/40 rounded-sm cursor-pointer group overflow-hidden hover:translate-x-0"
+                            style={{
+                                transform: !isBtnHovered ? `translateX(${spanWidth + 16}px)` : "translateX(0)",
+                                transition: "transform 0.5s ease",
+                            }}
+                        >
+                            <ArrowLeft
+                                size={22}
+                                strokeWidth={1.5}
+                                color={"var(--color-white)"}
+                            />
+                            <span
+                                ref={spanRef}
+                                className="text-white whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity duration-700 ease-in-out"
+                            >
+                            Course Content
+                        </span>
+                        </button>
+
+                    )
+                }
+                {
+                    showReviewModal && course && (
+                        <ModalReviewCourse
+                            courseId={course.id}
+                            closeModal={() => setShowReviewModal(false)}
+                            markCourseAsRated={markCourseAsRated}
+                            isUpdate={false}
                         />
                     )
                 }
-                <div
-                    className="flex flex-col gap-4 flex-grow py-vertical-md px-horizontal-sm text-left text-black-text">
-                    <h1 className="text-4xl font-semibold">{activeLecture?.title}</h1>
-                    <p className="text-lg leading-loose">{activeLecture?.contentText}</p>
-                    {
-                        (activeLecture?.contentType === "FILE" || activeLecture?.contentType === "TOOL" || activeLecture?.contentType === "QUIZ") && (
-                            <div className="flex justify-between w-full gap-20 items-center py-12">
-                                <p className="text-lg font-medium">
-                                    {activeLecture.contentFileName}
-                                </p>
-                                <button
-                                    disabled={isDownloading}
-                                    onClick={() => triggerDownload()}
-                                    className={`disabled:cursor-not-allowed disabled:opacity-40 hover:shadow-lg transition-all duration-300 ease-in-out cursor-pointer
-                                    bg-shifter text-white text-lg px-8 py-2 rounded-md shadow-md border-2 border-white/40 shadow-shifter/40`}
-                                >
-                                    {
-                                        isDownloading ? "Downloading..." : "Download File"
-                                    }
-                                </button>
-                            </div>
-                        )
-                    }
-                </div>
-
-                <div className="px-horizontal-sm py-vertical-md w-full flex justify-between items-center">
-                    {
-                        firstLectureId !== activeLecture?.id && (
-                            <button
-                                onClick={() => {
-                                    if (!course || !activeLecture) return;
-                                    const allLectures = course.courseContents.flatMap(content => content.courseLectures);
-                                    const currentIndex = allLectures.findIndex(lec => lec.id === activeLecture.id);
-                                    if (currentIndex > 0) {
-                                        setActiveLecture(allLectures[currentIndex - 1]);
-                                    }
-                                }}
-                                className="mr-auto flex items-center gap-2 text-lg cursor-pointer py-2">
-                                <MoveLeft size={20} strokeWidth={2}/>
-                                <TextWithUnderline label={"Previous Lecture"} fromRightToLeft={true}/>
-                            </button>
-                        )
-                    }
-                    {
-                        lastLectureId !== activeLecture?.id && (
-                            <button
-                                onClick={() => {
-                                    updateLecture(activeLecture?.userCourseProgress.id || -1, true)
-                                    if (!course || !activeLecture) return;
-                                    const allLectures = course.courseContents.flatMap(content => content.courseLectures);
-                                    const currentIndex = allLectures.findIndex(lec => lec.id === activeLecture.id);
-                                    if (currentIndex < allLectures.length - 1) {
-                                        setActiveLecture(allLectures[currentIndex + 1]);
-                                    }
-                                }}
-                                className="ml-auto flex items-center gap-2 text-lg cursor-pointer py-2">
-                                <TextWithUnderline label={"Next Lecture"}/>
-                                <MoveRight size={20} strokeWidth={2}/>
-                            </button>
-                        )
-                    }
-                </div>
-            </div>
-            {
-                activeLecture && course && showSideNav ? (
-                    <CourseContentSideNav
-                        activeLecture={activeLecture}
-                        setActiveLecture={setActiveLecture}
-                        courseContents={course.courseContents}
-                        updateLecture={updateLecture}
-                        closeModal={() => setShowSideNav(false)}
-                    />
-                ) : (
-                    <button
-                        onMouseEnter={() => setIsBtnHovered(true)}
-                        onMouseLeave={() => setIsBtnHovered(false)}
-                        onClick={() => {
-                            setShowSideNav(true)
-                            setIsBtnHovered(false)
-                        }}
-                        className="absolute top-12 right-0 flex items-center gap-2
-                        h-fit bg-shifter px-4 py-2 border border-white/40 rounded-sm cursor-pointer group overflow-hidden hover:translate-x-0"
-                        style={{
-                            transform: !isBtnHovered ? `translateX(${spanWidth + 16}px)` : "translateX(0)",
-                            transition: "transform 0.5s ease",
-                        }}
-                    >
-                        <ArrowLeft
-                            size={22}
-                            strokeWidth={1.5}
-                            color={"var(--color-white)"}
-                        />
-                        <span
-                            ref={spanRef}
-                            className="text-white whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity duration-700 ease-in-out"
-                        >
-                            Course Content
-                        </span>
-                    </button>
-
-                )
-            }
-        </main>
+            </main>
+        </>
     )
 }
 
+function LastLectureFinished({title, onClick, btnText, btnShow}: {
+    title: string,
+    onClick: () => void,
+    btnText: string | JSX.Element,
+    btnShow: boolean
+}) {
+
+    return (
+        <>
+            <h1 className="text-3xl font-semibold">{title}</h1>
+            <div className="flex flex-col gap-4">
+                {
+                    btnShow && (
+                        <button
+                            onClick={onClick}
+                            className="hover:bg-shifter/10
+                            flex gap-2 items-center text-lg  text-shifter font-bold px-8 py-2 rounded-md border-1 border-shifter cursor-pointer">
+                            {btnText}
+                        </button>
+                    )}
+                <Link to="/learn"
+                      className="text-lg font-bold text-shifter underline hover:text-shifter/60">
+                    Exit from Course
+                </Link>
+            </div>
+        </>
+    )
+}
+
 export default CourseLearn;
Index: ontend/src/pages/Dashboard.tsx
===================================================================
--- frontend/src/pages/Dashboard.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ 	(revision )
@@ -1,18 +1,0 @@
-import DashboardCourses from "../components/DashboardCourses.tsx";
-
-function Dashboard() {
-
-    return (
-        <main className="flex gap-4 px-horizontal-md py-vertical-lg">
-            <div className="w-3/5">
-                <DashboardCourses/>
-            </div>
-
-            <div className="w-2/5">
-
-            </div>
-        </main>
-    )
-}
-
-export default Dashboard;
Index: frontend/src/pages/FreeConsultation.tsx
===================================================================
--- frontend/src/pages/FreeConsultation.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/pages/FreeConsultation.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -3,4 +3,5 @@
 import {fetchExpertFreeTimeSlotsApi, scheduleMeetingApi} from "../api/meetingApi.ts";
 import type {UserMeetingInfoRequest} from "../models/UserMeetingInfoRequest.tsx";
+import ShifterArrow from "../../public/Shifter-Arrow-White.png"
 
 function FreeConsultation() {
@@ -64,5 +65,5 @@
             <section
                 style={{paddingTop: 'calc(var(--spacing-top-nav-lg) + 4rem)'}}
-                className="bg-dark-blue text-white w-full px-horizontal-lg py-vertical-lg pt-top-nav-lg text-left">
+                className="relative bg-dark-blue text-white w-full px-horizontal-lg py-vertical-lg pt-top-nav-lg text-left overflow-x-clip">
                 <div className="flex flex-col gap-4 w-1/2">
                     <h1 className="text-5xl font-bold">Book Your Free Expert Session</h1>
@@ -72,4 +73,6 @@
                     </p>
                 </div>
+
+                <img src={ShifterArrow} className="absolute right-20 -bottom-20 h-120 rotate-45 opacity-5"/>
             </section>
 
@@ -115,5 +118,5 @@
                             className="text-black font-medium">{user?.email}</span></p>
                         <p className="font-light text-black/60 text-lg ">Company Type: <span
-                            className="text-black font-medium">{user?.companyType.toLowerCase().split("_").map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(" ")}</span>
+                            className="text-black font-medium">{user?.companySize.toLowerCase().split("_").map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(" ")}</span>
                         </p>
                         <p className="font-light text-black/60 text-lg ">Work Position: <span
@@ -178,4 +181,5 @@
                                             firstOption={"Select a time"}
                                             options={freeSlots[selectedDate]}
+                                            isDisabled={selectedDate.length === 0}
                                         />
                                     </>
@@ -251,14 +255,17 @@
 }
 
-function SelectInput({value, onChange, firstOption, options}: {
+function SelectInput({value, onChange, firstOption, options, isDisabled}: {
     value: string;
     onChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
     firstOption: string;
     options: string[];
+    isDisabled?: boolean;
 }) {
     return (
         <select
-            className="bg-dark-blue/5 border-1 border-black/10 py-2 px-8 rounded-sm
+            className="disabled:opacity-20 disabled:cursor-not-allowed
+            bg-dark-blue/5 border-1 border-black/10 py-2 px-8 rounded-sm
                 font-medium resize-none overflow-hidden min-h-fit cursor-pointer"
+            disabled={isDisabled}
             value={value} onChange={onChange}>
             <option value="">{firstOption}</option>
Index: frontend/src/pages/Home.tsx
===================================================================
--- frontend/src/pages/Home.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/pages/Home.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -1,17 +1,17 @@
 import HeroHome from "../components/HeroHome.tsx";
 import CollaborationSteps from "../components/CollaborationSteps.tsx";
-import RoadmapAI from "../components/RoadmapAI.tsx";
 import ShifterValues from "../components/ShifterValues.tsx";
 import CoursesCarouselHome from "../components/CoursesCarouselHome.tsx";
+import OurServices from "../components/OurServices.tsx";
 
 function Home() {
 
     return (
-        <main className="bg-white">
-            <div className="bg-dark-blue">
+        <main className="bg-beige">
+            <div className="px-4 py-vertical-sm">
                 <HeroHome/>
-                <CollaborationSteps/>
             </div>
-            <RoadmapAI/>
+            <OurServices />
+            <CollaborationSteps/>
             <CoursesCarouselHome/>
             <ShifterValues/>
Index: frontend/src/pages/Learn.tsx
===================================================================
--- frontend/src/pages/Learn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Learn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,143 @@
+import {useEnrolledCourses} from "../hooks/useEnrolledCourses.tsx";
+import { useState} from "react";
+import {useAuthContext} from "../context/AuthContext.tsx";
+import CourseCardEnrolled from "../components/CourseCardEnrolled.tsx";
+import CourseCardEnrolledSkeleton from "../components/skeletons/CourseCardEnrolledSkeleton.tsx";
+
+function Learn() {
+    const [selectedTab, setSelectedTab] = useState("all");
+    const {user} = useAuthContext();
+    const {
+        allCourses,
+        enrolledCourses,
+        setEnrolledCourses,
+        loading
+    } = useEnrolledCourses();
+
+    function renderContent() {
+        if (enrolledCourses.length === 0) {
+            return (
+                <h2 className="text-2xl font-semibold text-black/60">
+                    No limits, just potential — enroll in your first course!
+                </h2>
+            );
+        }
+
+        switch (selectedTab) {
+            case "all":
+                return (
+                    <>
+                        {
+                            enrolledCourses.map((course, index) => (
+                                <CourseCardEnrolled
+                                    course={course}
+                                    key={index}
+                                    markCourseAsRated={(rating) => setEnrolledCourses([
+                                        ...enrolledCourses.filter(c => c.id !== course.id),
+                                        {...course, rating: rating}
+                                    ])}
+                                />
+                            ))
+                        }
+                    </>
+                );
+            case "active":
+                return (
+                    <>
+                        {
+                            enrolledCourses.map((course, index) => {
+                                if (course.isFinished) return null;
+                                return (
+                                    <CourseCardEnrolled
+                                        course={course}
+                                        key={index}
+                                        markCourseAsRated={(rating) => setEnrolledCourses([
+                                            ...enrolledCourses.filter(c => c.id !== course.id),
+                                            {...course, rating: rating}
+                                        ])}
+                                    />
+                                )
+                            })
+                        }
+                    </>
+                );
+            case "completed":
+                return (
+                    <>
+                        {
+                            enrolledCourses.map((course, index) => {
+                                if (!course.isFinished) return null;
+                                return (
+                                    <CourseCardEnrolled
+                                        course={course}
+                                        key={index}
+                                        markCourseAsRated={(rating) => setEnrolledCourses([
+                                            ...enrolledCourses.filter(c => c.id !== course.id),
+                                            {...course, rating: rating}
+                                        ])}
+                                    />
+                                )
+                            })
+                        }
+                    </>
+                );
+            case "favorites":
+                return (
+                    <>
+                        {
+                            allCourses.filter(course => user?.favoriteCourses.includes(course.id)).map((course, index) => (
+                                <CourseCardEnrolled course={course} key={index}/>
+                            ))
+                        }
+                    </>
+                );
+        }
+    }
+
+
+    return (
+        <main className="flex flex-col gap-0">
+            <section className="border-b-2 border-white/40
+            bg-dark-blue text-white px-horizontal-md w-full flex flex-col gap-4 text-left pt-top-nav-lg">
+                <h1 className="text-4xl font-semibold">My Learning</h1>
+                <ul>
+                    <ListTab name={"All"} isSelected={selectedTab === "all"}
+                             setSelectedTab={() => setSelectedTab("all")}/>
+                    <ListTab name={"Active"} isSelected={selectedTab === "active"}
+                             setSelectedTab={() => setSelectedTab("active")}/>
+                    <ListTab name={"Completed"} isSelected={selectedTab === "completed"}
+                             setSelectedTab={() => setSelectedTab("completed")}/>
+                    <ListTab name={"Favorites"} isSelected={selectedTab === "favorites"}
+                             setSelectedTab={() => setSelectedTab("favorites")}/>
+                </ul>
+            </section>
+            <section className="grid grid-cols-4 gap-x-4 gap-y-8 px-horizontal-md py-vertical-md items-stretch">
+                {
+                    loading ?
+                        new Array(8).fill(0).map((_, index) => (
+                            <CourseCardEnrolledSkeleton key={index} />
+                        )) : renderContent()
+                }
+            </section>
+        </main>
+    )
+}
+
+function ListTab({name, isSelected, setSelectedTab}: {
+    name: string;
+    isSelected: boolean;
+    setSelectedTab: () => void;
+}) {
+    return (
+        <li className="inline-block text-lg font-medium ">
+            <button
+                className={`hover:text-white px-4 py-2 cursor-pointer ${isSelected ? "border-b-2 border-white" : "text-white/40"}`}
+                onClick={setSelectedTab}
+            >
+                {name}
+            </button>
+        </li>
+    )
+}
+
+export default Learn;
Index: frontend/src/pages/Mentoring.tsx
===================================================================
--- frontend/src/pages/Mentoring.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Mentoring.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,189 @@
+import {Instagram, Linkedin, Mail, MapPin} from "lucide-react"
+import React from "react";
+import {useAuthContext} from "../context/AuthContext.tsx";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import Arrow from "../../public/Shifter-Arrow-White.png"
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
+import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
+import NavbarLink from "../components/NavbarLink.tsx";
+import {sendEmailApi} from "../api/contactApi.ts";
+
+function Mentoring() {
+    const {user, accessToken} = useAuthContext();
+    const [subject, setSubject] = React.useState("");
+    const [message, setMessage] = React.useState("");
+    const [loading, setLoading] = React.useState(false);
+
+    const handleSubmit = (e: React.FormEvent) => {
+        e.preventDefault();
+        // Handle form submission logic here
+        console.log("Subject:", subject);
+        console.log("Message:", message);
+
+        setLoading(true);
+        sendEmailApi(accessToken || "", "Mentoring: " + subject, message)
+            .then(() => {
+                console.log("Successfully sent email");
+            })
+            .catch((err) => {
+                console.error("Error sending email:", err);
+            })
+            .finally(() => setLoading(false));
+    }
+
+    return (
+        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
+            {/*Hero*/}
+            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg
+                text-white-text">
+                <h1 className="text-5xl font-bold">Dedicated 1:1 Mentorship</h1>
+                <p className="text-xl font-light">
+                    Our program ensures maximum client success by operating with <strong className="font-bold">limited openings. </strong>
+                    This guarantees that every partner receives the <strong className="font-bold">undivided attention</strong> and continuous strategic input
+                    necessary to <strong className="font-bold">achieve their objectives. </strong> Submit your inquiry to begin the assessment for one of our dedicated slots.
+                </p>
+            </section>
+
+
+            {/*Contact Form*/}
+            <section className=" flex items-center justify-center w-full px-horizontal-lg">
+                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4
+                    shadow-md shadow-black/10">
+
+                    {/*Contact Info*/}
+                    <div className="border-1 border-white/40
+                    relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
+                        <div className="flex flex-col gap-2 items-start text-left">
+                            <h2 className="text-2xl font-semibold whitespace-nowrap">Contact Information</h2>
+                            <p className="text-white/80 font-light text-sm">
+                                Complete the form and our team will respond shortly to help you take the next step.
+                            </p>
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <Mail size={24} color="var(--color-white)" />
+                            contact@shift-er.com
+                        </div>
+                        <div className="flex gap-4 items-center">
+                            <MapPin size={24} color="var(--color-white)" />
+                            Skopje, N. Macedonia
+                        </div>
+
+                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
+                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow" />
+                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow" />
+                        </div>
+                    </div>
+
+                    {/*Form*/}
+                    <div className="flex flex-col gap-4 col-span-2">
+                        <div className="flex justify-betwee gap-20 items-center">
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Name: <span
+                                className="text-black-text font-normal">{user?.name}</span></p>
+                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">Email: <span
+                                className="text-black-text font-normal">{user?.email}</span></p>
+                            <p className="text-black/40 text-sm col-span-2">
+                                These values are automatically populated from your profile.
+                                If any of them are incorrect, please update them in the Profile page.
+                            </p>
+                        </div>
+
+                        <hr className="border-t-2 border-black/20"/>
+
+                        <form
+                            onSubmit={handleSubmit}
+                            className="flex flex-col gap-4 items-start">
+                            <TextInput
+                                label="Your Subject"
+                                name="subject"
+                                placeholder="Enter the subject of your message"
+                                rows={1}
+                                onChange={(e) => setSubject(e.target.value)}
+                            />
+                            <TextInput
+                                label="Message"
+                                name="message"
+                                placeholder="Write your message here..."
+                                rows={8}
+                                onChange={(e) => setMessage(e.target.value)}
+                            />
+                            <div className="flex items-center gap-6">
+                                <button
+                                    className="hover:shadow-shifter/40 transition-all duration-200 ease-in-out
+                                    disabled:cursor-not-allowed disabled:opacity-60
+                                    shadow-md shadow-shifter/20 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
+                                    disabled={loading}
+                                    type="submit">
+                                    {loading ? "Sending..." : "Send Message"}
+                                </button>
+                                {
+                                    loading && <div className="loader" />
+                                }
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </section>
+
+            <footer className="flex justify-between px-horizontal-lg py-vertical-sm ">
+                <img src={ShifterLogo} alt="Shifter - Business Consulting, Mentoring & Online Courses Logo"
+                     className="h-12"
+                />
+
+                <div className="flex gap-4 items-center">
+                    <NavbarLink to={"/mentoring"} label={"Mentoring"} className="text-sm"/>
+                    <NavbarLink to={"/consulting"} label={"Consulting"} className="text-sm"/>
+                    <NavbarLink to={"/courses"} label={"Courses"} className="text-sm"/>
+                    <NavbarLink to={"/academies"} label={"Academies"} className="text-sm"/>
+                </div>
+
+                <div className="flex gap-4 ">
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Linkedin size={20} color="var(--color-shifter)"/>
+                    </a>
+
+                    <a
+                        href="http://www.google.com"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
+                    >
+                        <Instagram size={20} color="var(--color-shifter)"/>
+                    </a>
+                </div>
+            </footer>
+        </main>
+    )
+}
+
+
+function TextInput({label, name, placeholder, rows, onChange}: {
+    label: string;
+    name: string;
+    placeholder: string;
+    rows: number;
+    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
+}) {
+    return (
+        <label className="w-full flex flex-col items-start gap-2">
+            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
+            <textarea
+                onChange={onChange}
+                rows={rows}
+                name={name}
+                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm
+                resize-none min-h-fit custom-scrollbar
+                focus:outline-none focus:border-shifter/40 focus:border-2"
+                placeholder={placeholder}
+            />
+        </label>
+    )
+}
+
+export default Mentoring
Index: frontend/src/pages/Register.tsx
===================================================================
--- frontend/src/pages/Register.tsx	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/src/pages/Register.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -34,5 +34,5 @@
         name: "",
         workPosition: "",
-        companyType: "",
+        companySize: "",
         interests: [],
         desiredSkills: [],
Index: frontend/tailwind.config.js
===================================================================
--- frontend/tailwind.config.js	(revision fcb98a188079a5fc4d0f566d2251f6416711f591)
+++ frontend/tailwind.config.js	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -33,4 +33,5 @@
                 gray: '#E5E7EB',
                 'black-text': '#333333',
+                'white-text': '#EEEEEE',
             },
             boxShadow: {
Index: package-lock.json
===================================================================
--- package-lock.json	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ package-lock.json	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
@@ -0,0 +1,6 @@
+{
+  "name": "Shifter",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {}
+}
