Index: backend/.gitignore
===================================================================
--- backend/.gitignore	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/.gitignore	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -9,5 +9,5 @@
 
 .env
-./src/main/java/com/shifterwebapp/shifter/external/service-account.json
+src/main/resources/service-account.json
 
 ### IntelliJ IDEA ###
Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/pom.xml	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -185,4 +185,10 @@
 		</dependency>
 
+		<!-- PDF -->
+		<dependency>
+			<groupId>org.apache.pdfbox</groupId>
+			<artifactId>pdfbox</artifactId>
+			<version>2.0.30</version>
+		</dependency>
 
 
Index: backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -30,7 +30,8 @@
 		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_SERVICE_ACCOUNT_EMAIL", dotenv.get("GOOGLE_SERVICE_ACCOUNT_EMAIL"));
-		System.setProperty("GOOGLE_PRIVATE_KEY", dotenv.get("GOOGLE_PRIVATE_KEY").replace("\\n", "\n"));
+		System.setProperty("GOOGLE_CALENDAR_PRIVATE_KEY", dotenv.get("GOOGLE_CALENDAR_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 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -26,3 +26,5 @@
                 );
     }
+
+
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -4,4 +4,5 @@
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
 import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.config.Customizer;
@@ -55,4 +56,5 @@
         config.addAllowedMethod("*");
         config.setAllowCredentials(true);
+        config.addExposedHeader(HttpHeaders.CONTENT_DISPOSITION);
 
         UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
Index: backend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -3,6 +3,6 @@
 import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.course.service.CourseService;
-import com.shifterwebapp.shifter.upload.S3Service;
-import com.shifterwebapp.shifter.upload.S3UploadResponse;
+import com.shifterwebapp.shifter.external.upload.S3Service;
+import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.ResponseEntity;
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -1,5 +1,4 @@
 package com.shifterwebapp.shifter.course;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.auth.CustomAuthDetails;
@@ -11,7 +10,13 @@
 import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
 import com.shifterwebapp.shifter.exception.ErrorResponse;
-import com.shifterwebapp.shifter.upload.S3Service;
-import com.shifterwebapp.shifter.upload.S3UploadResponse;
+import com.shifterwebapp.shifter.external.upload.S3Service;
+import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
 import lombok.RequiredArgsConstructor;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.Authentication;
@@ -19,5 +24,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
@@ -152,4 +159,19 @@
     }
 
+    @GetMapping("/{courseId}/certificate")
+    public ResponseEntity<byte[]> getCourseCertificate(@PathVariable("courseId") Long courseId, Authentication authentication) throws Exception {
+        Long userId = validate.extractUserId(authentication);
+
+        byte[] personalizedPdf = courseService.downloadCertificate(courseId, userId);
+
+        String fileName = courseService.getCourseById(courseId).getTitleShort().replaceAll("\\s+", "_") + "_Certificate.pdf";
+
+        return ResponseEntity.ok()
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
+                .contentType(MediaType.APPLICATION_PDF)
+                .contentLength(personalizedPdf.length)
+                .body(personalizedPdf);
+    }
+
     @GetMapping("/topics")
     public ResponseEntity<List<String>> getAllTopics() {
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -11,25 +11,30 @@
 import com.shifterwebapp.shifter.course.mapper.CourseMapper;
 import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.coursecontent.CourseContentDtoFull;
 import com.shifterwebapp.shifter.courselecture.CourseLecture;
-import com.shifterwebapp.shifter.courselecture.CourseLectureDtoFull;
 import com.shifterwebapp.shifter.enrollment.Enrollment;
 import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
 import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.upload.MetaInfo;
-import com.shifterwebapp.shifter.upload.S3UploadResponse;
+import com.shifterwebapp.shifter.external.PdfManipulationService;
+import com.shifterwebapp.shifter.external.upload.MetaInfo;
+import com.shifterwebapp.shifter.external.upload.S3Service;
+import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
 import com.shifterwebapp.shifter.user.UserDto;
 import com.shifterwebapp.shifter.user.service.UserService;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressMapper;
-import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
 import lombok.RequiredArgsConstructor;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.apache.pdfbox.text.PDFTextStripper;
 import org.springframework.stereotype.Service;
 
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
+import java.util.Locale;
 
 @Service
@@ -38,4 +43,6 @@
 
     private final CourseRepository courseRepository;
+    private final S3Service s3Service;
+    private final PdfManipulationService pdfService;
     private final CourseMapper courseMapper;
     private final UserService userService;
@@ -128,4 +135,39 @@
     }
 
+    public byte[] downloadCertificate(Long courseId, Long userId) throws Exception {
+        validate.validateCourseExists(courseId);
+        if (!enrollmentService.isUserEnrolledInCourse(userId, courseId))
+            throw new AccessDeniedException("User with ID " + userId + " is not enrolled in course with ID " + courseId + " and is therefore not authorized to access the course certificate!");
+
+        String courseTitle = getCourseById(courseId).getTitleShort();
+        String userName = userService.getUserById(userId).getName();
+        LocalDate completedDate = enrollmentService.getEnrollmentByUserAndCourse(userId, courseId).getCompletedAt();
+
+        // TODO: uncomment this and check if logic for date is okay
+//        if (completedDate == null)
+//            throw new AccessDeniedException("User with ID " + userId + " has not yet completed course with ID " + courseId + " and is therefore not authorized to access the course certificate!");
+
+        String date = (completedDate != null ? completedDate : LocalDate.now()).format(DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH));
+
+        // 1. Define the S3 key for your template PDF
+        String s3Key = "private/Shifter_Certificate.pdf";
+
+        // 2. Fetch the template PDF from S3 as an InputStream
+        try (InputStream templateStream = s3Service.downloadFile(s3Key)) {
+
+            // 3. Modify the PDF with the dynamic data
+            byte[] personalizedPdf = pdfService.fillPdfForm(
+                    templateStream,
+                    userName,
+                    "This is to certify that",
+                    "has successfully completed the course " + courseTitle + " through Shifter, demonstrating commitment to continuous learning and professional growth.",
+                    date,
+                    courseTitle
+            );
+
+            return personalizedPdf;
+        }
+    }
+
     @Override
     public List<CourseDtoPreview> getAllCourses(List<Long> courseIds) {
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -7,6 +7,7 @@
 import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
 import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
-import com.shifterwebapp.shifter.upload.S3UploadResponse;
+import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
 
+import java.io.ByteArrayOutputStream;
 import java.util.List;
 
@@ -20,4 +21,6 @@
 
     CourseDtoFull getEnrolledCourseById(Long courseId, Long userId);
+
+    byte[] downloadCertificate(Long courseId, Long userId) throws Exception;
 
 //    List<CourseDtoPreview> getAllCourses(Specification<Course> specification);
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -184,3 +184,5 @@
         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 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -5,4 +5,5 @@
 import com.shifterwebapp.shifter.enums.EnrollmentStatus;
 
+import java.time.LocalDate;
 import java.util.List;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/external/PdfManipulationService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/PdfManipulationService.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/PdfManipulationService.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -0,0 +1,202 @@
+package com.shifterwebapp.shifter.external;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentInformation;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class PdfManipulationService {
+
+    // --- Page Dimensions ---
+    private static final float CERTIFICATE_WIDTH = 842.4f;
+
+    // --- Common X Start Position (Left-Aligned) ---
+    private static final float COMMON_TEXT_START_X_POSITION = 300.0f;
+
+    // First Sentence (Montserrat size 15 Bold)
+    private static final float FIRST_SENTENCE_Y_POSITION = 340.0f;
+    private static final float SENTENCE_MAX_WIDTH = 500.0f;
+
+    // User Name (Lexend Deca size 42)
+    private static final float USER_NAME_Y_POSITION = 260.0f;
+    private static final float USER_NAME_MAX_WIDTH = 500.0f;
+
+    // Second Sentence (Montserrat size 14)
+    private static final float SECOND_SENTENCE_Y_POSITION = 220.0f;
+    private static final float LINE_SPACING_PT = 18.0f;
+    private static final int MAX_LINES_FOR_SECOND_SENTENCE = 4;
+
+    // Date (Montserrat size 13)
+    private static final float DATE_START_X_POSITION = 60.0f;
+    private static final float DATE_Y_POSITION = 45.5f;
+
+    public byte[] fillPdfForm(InputStream pdfTemplateStream,
+                              String name,
+                              String firstSentence,
+                              String secondSentence,
+                              String date,
+                              String courseTitle) throws IOException {
+
+        try (PDDocument pdfDocument = PDDocument.load(pdfTemplateStream);
+             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
+
+            PDDocumentInformation info = pdfDocument.getDocumentInformation();
+
+            info.setTitle(courseTitle + " Certificate");
+            info.setAuthor("Shifter");
+
+            PDPage page = pdfDocument.getPage(0);
+
+            try (PDPageContentStream contentStream = new PDPageContentStream(
+                    pdfDocument, page, PDPageContentStream.AppendMode.APPEND, true, true)) {
+
+                // --- 1. Draw and Wrap the First Sentence (No explicit limit) ---
+                drawWrappedText(
+                        contentStream,
+                        firstSentence.toUpperCase(),
+                        COMMON_TEXT_START_X_POSITION,
+                        FIRST_SENTENCE_Y_POSITION,
+                        SENTENCE_MAX_WIDTH,
+                        PDType1Font.HELVETICA_BOLD,
+                        15,
+                        Integer.MAX_VALUE
+                );
+
+                // --- 2. Draw and Scale the User Name (Single Line, Scales Down) ---
+                drawLeftAlignedAndScaleText(
+                        contentStream,
+                        name,
+                        COMMON_TEXT_START_X_POSITION,
+                        USER_NAME_Y_POSITION,
+                        USER_NAME_MAX_WIDTH,
+                        PDType1Font.HELVETICA_BOLD,
+                        42
+                );
+
+                // --- 3. Draw and Wrap the Second Sentence (Max 4 Lines) ---
+                drawWrappedText(
+                        contentStream,
+                        secondSentence,
+                        COMMON_TEXT_START_X_POSITION,
+                        SECOND_SENTENCE_Y_POSITION,
+                        SENTENCE_MAX_WIDTH,
+                        PDType1Font.HELVETICA,
+                        14,
+                        MAX_LINES_FOR_SECOND_SENTENCE
+                );
+
+                // --- 4. Draw the Date (Left Aligned, Fixed Size) ---
+                drawLeftAlignedText(
+                        contentStream,
+                        date,
+                        DATE_START_X_POSITION,
+                        DATE_Y_POSITION,
+                        PDType1Font.HELVETICA,
+                        13
+                );
+
+            }
+
+            pdfDocument.save(outputStream);
+            return outputStream.toByteArray();
+        }
+    }
+
+    /**
+     * Splits and draws text, automatically wrapping to the next line when max width is exceeded,
+     * and enforcing a maximum line limit. **FIXED** to draw each line independently.
+     */
+    private void drawWrappedText(PDPageContentStream contentStream, String text, float xPosition, float yPosition, float maxWidth, PDType1Font font, float fontSize, int lineLimit) throws IOException {
+
+        List<String> lines = getWrappedLines(text, font, fontSize, maxWidth);
+        int linesToDraw = Math.min(lines.size(), lineLimit);
+
+        // Draw each line independently using its own beginText/endText block
+        for (int i = 0; i < linesToDraw; i++) {
+
+            float lineY = yPosition - (i * LINE_SPACING_PT);
+            String line = lines.get(i);
+
+            // If the line is the last one allowed and the text was truncated, add an ellipsis
+            if (i == linesToDraw - 1 && lines.size() > lineLimit) {
+                line = line.trim() + "...";
+            }
+
+            contentStream.beginText();
+            contentStream.setFont(font, fontSize);
+            // This sets the absolute position for the current line
+            contentStream.newLineAtOffset(xPosition, lineY);
+            contentStream.showText(line.trim());
+            contentStream.endText();
+        }
+    }
+
+    /**
+     * Finds the largest font size (up to maxFontSize) that fits the text within maxWidth,
+     * then draws it left-aligned at the specified xPosition. (Used for single-line text like the Name).
+     */
+    private void drawLeftAlignedAndScaleText(PDPageContentStream contentStream, String text, float xPosition, float yPosition, float maxWidth, PDType1Font font, float maxFontSize) throws IOException {
+
+        float fontSize = maxFontSize;
+        float textWidth = font.getStringWidth(text) / 1000 * fontSize;
+
+        while (textWidth > maxWidth && fontSize > 10) {
+            fontSize -= 0.5f;
+            textWidth = font.getStringWidth(text) / 1000 * fontSize;
+        }
+
+        contentStream.beginText();
+        contentStream.setFont(font, fontSize);
+        contentStream.newLineAtOffset(xPosition, yPosition);
+        contentStream.showText(text);
+        contentStream.endText();
+    }
+
+    /**
+     * Draws text left-aligned at a specific fixed position and size (no scaling, no wrapping).
+     */
+    private void drawLeftAlignedText(PDPageContentStream contentStream, String text, float xPosition, float yPosition, PDType1Font font, float fontSize) throws IOException {
+
+        contentStream.beginText();
+        contentStream.setFont(font, fontSize);
+        contentStream.newLineAtOffset(xPosition, yPosition);
+        contentStream.showText(text);
+        contentStream.endText();
+    }
+
+    /**
+     * Utility function to calculate how the text should be wrapped.
+     */
+    private List<String> getWrappedLines(String text, PDType1Font font, float fontSize, float maxWidth) throws IOException {
+        List<String> lines = new ArrayList<>();
+        String[] words = text.split(" ");
+        StringBuilder currentLine = new StringBuilder();
+
+        for (String word : words) {
+            String testLine = currentLine.length() == 0 ? word : currentLine.toString() + " " + word;
+            float testWidth = font.getStringWidth(testLine) / 1000 * fontSize;
+
+            if (testWidth > maxWidth && currentLine.length() > 0) {
+                lines.add(currentLine.toString().trim());
+                currentLine = new StringBuilder(word + " ");
+            } else {
+                currentLine.append(word).append(" ");
+            }
+        }
+
+        if (currentLine.length() > 0) {
+            lines.add(currentLine.toString().trim());
+        }
+
+        return lines;
+    }
+}
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 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -2,4 +2,5 @@
 
 import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.ResponseEntity;
@@ -16,11 +17,13 @@
 
     private final EmailService emailService;
+    private final UserService userService;
     private final Validate validate;
 
     @PostMapping("/contact-us")
     public ResponseEntity<?> sendEmailToExpert(@RequestBody ContactReq contactReq, Authentication authentication) {
-        validate.validateUserIsAuthenticated(authentication);
+        Long userId = validate.extractUserId(authentication);
+        String userEmail = userService.getUserEmailById(userId);
 
-        emailService.contactExpert(contactReq);
+        emailService.contactExpert(userEmail, 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 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailService.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -8,4 +8,5 @@
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Value;
 
 import java.io.IOException;
@@ -28,9 +29,16 @@
     private final JavaMailSender mailSender;
 
-    public void contactExpert(ContactReq contactReq) {
+    @Value("${EMAIL_USERNAME}")
+    private String expertEmail;
+
+    public void contactExpert(String userEmail, ContactReq contactReq) {
         SimpleMailMessage message = new SimpleMailMessage();
-        message.setTo(System.getProperty("EMAIL_USERNAME"));
+
+        message.setFrom(expertEmail);
+        message.setTo(expertEmail);
+        message.setReplyTo(userEmail);
         message.setSubject("New Contact Message: " + contactReq.getSubject());
-        message.setText(contactReq.getText());
+        String body = "From: " + userEmail + "\n\n" + contactReq.getText();
+        message.setText(body);
         int maxRetries = 3;
         int attempt = 0;
@@ -42,4 +50,5 @@
                 attempt++;
                 if (attempt >= maxRetries) {
+                    System.out.println(e.getMessage());
                     throw new RuntimeException("Failed to send email to expert after " + attempt + " attempts", e);
                 }
@@ -57,5 +66,6 @@
             helper.setTo(to);
             helper.setSubject("Welcome to " + courseName + "! Start Learning Now");
-            helper.setFrom("support@shift-er.com");
+            helper.setFrom(expertEmail);
+            helper.setReplyTo("support@shift-er.com");
 
             int currentYear = Year.now().getValue();
@@ -108,5 +118,6 @@
             helper.setTo(to);
             helper.setSubject(subject);
-            helper.setFrom("support@shift-er.com");
+            helper.setFrom(expertEmail);
+            helper.setReplyTo("support@shift-er.com");
 
             String currentYear = String.valueOf(java.time.Year.now().getValue());
@@ -180,5 +191,6 @@
             helper.setTo(to);
             helper.setSubject(subject);
-            helper.setFrom("support@shift-er.com");
+            helper.setFrom(expertEmail);
+            helper.setReplyTo("support@shift-er.com");
 
             String currentYear = String.valueOf(Year.now().getValue());
@@ -235,5 +247,6 @@
             helper.setTo(expertEmail); // Send to the expert's email
             helper.setSubject(subject);
-            helper.setFrom("support@shift-er.com");
+            helper.setFrom(expertEmail);
+            helper.setReplyTo("support@shift-er.com");
 
             String currentYear = String.valueOf(Year.now().getValue());
Index: backend/src/main/java/com/shifterwebapp/shifter/external/upload/MetaInfo.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/MetaInfo.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/upload/MetaInfo.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -0,0 +1,14 @@
+package com.shifterwebapp.shifter.external.upload;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class MetaInfo {
+    private Integer contentPosition;
+    private Integer lecturePosition;
+    private Long courseId;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Controller.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Controller.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Controller.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -0,0 +1,58 @@
+package com.shifterwebapp.shifter.external.upload;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.course.service.CourseService;
+import com.shifterwebapp.shifter.courselecture.service.CourseLectureService;
+import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
+import com.shifterwebapp.shifter.exception.AccessDeniedException;
+import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("${api.base.path}/s3")
+@RequiredArgsConstructor
+public class S3Controller {
+
+    private final S3Service s3Service;
+    private final EnrollmentService enrollmentService;
+    private final CourseService courseService;
+    private final CourseLectureService courseLectureService;
+    private final Validate validate;
+
+    @GetMapping("/presigned-url")
+    public Map<String, String> getPresignedUrl(
+            @RequestParam Long courseId,
+            @RequestParam Long lectureId,
+            @RequestParam String fileName,
+            @RequestParam int expirySeconds,
+            Authentication authentication
+    ) {
+        Long userId = validate.extractUserId(authentication);
+
+        if (!enrollmentService.isUserEnrolledInCourse(userId, courseId)) {
+            throw new AccessDeniedException("You do not have access to this course content.");
+        }
+
+        String contentType = courseLectureService.getContentType(fileName, courseId, lectureId);
+        if (contentType == null) {
+            throw new ResourceNotFoundException("Content type not found for the specified file.");
+        }
+
+        String key = "private/courseContent/" + contentType.toLowerCase() + "/course_" + courseId + "/" + fileName;
+        System.out.println(key);
+
+        if (!courseService.lectureFileExistsInCourse(courseId, fileName)) {
+            throw new ResourceNotFoundException("File does not exist in the course.");
+        }
+
+        String url = s3Service.generatePresignedGetUrl(key, expirySeconds).toString();
+        return Map.of("url", url);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Service.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Service.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Service.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -0,0 +1,142 @@
+package com.shifterwebapp.shifter.external.upload;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.core.ResponseInputStream;
+import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.model.GetObjectResponse;
+import software.amazon.awssdk.services.s3.model.PutObjectRequest;
+import software.amazon.awssdk.services.s3.presigner.S3Presigner;
+import software.amazon.awssdk.services.s3.model.GetObjectRequest;
+import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
+import java.time.Duration;
+
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class S3Service {
+
+    @Value("${aws.access-key}")
+    private String accessKey;
+
+    @Value("${aws.secret-key}")
+    private String secretKey;
+
+    @Value("${aws.region}")
+    private String region;
+
+    @Value("${aws.s3.bucket-name}")
+    private String bucketName;
+
+    public URL generatePresignedGetUrl(String key, int expirySeconds) {
+        S3Presigner presigner = S3Presigner.builder()
+                .region(Region.of(region))
+                .credentialsProvider(StaticCredentialsProvider.create(
+                        AwsBasicCredentials.create(accessKey, secretKey)
+                ))
+                .build();
+
+        GetObjectRequest getObjectRequest = GetObjectRequest.builder()
+                .bucket(bucketName)
+                .key(key)
+                .build();
+
+        GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
+                .signatureDuration(Duration.ofSeconds(expirySeconds))
+                .getObjectRequest(getObjectRequest)
+                .build();
+
+        URL url = presigner.presignGetObject(presignRequest).url();
+        presigner.close();
+        return url;
+    }
+
+    public ResponseInputStream<GetObjectResponse> downloadFile(String key) {
+        S3Client s3Client = S3Client.builder()
+                .region(Region.of(region))
+                .credentialsProvider(
+                        StaticCredentialsProvider.create(
+                                AwsBasicCredentials.create(accessKey, secretKey)
+                        )
+                )
+                .build();
+
+        GetObjectRequest getObjectRequest = GetObjectRequest.builder()
+                .bucket(bucketName)
+                .key(key)
+                .build();
+
+        return s3Client.getObject(getObjectRequest);
+    }
+
+    public List<S3UploadResponse> uploadCourseImageAndFiles(
+            Long courseId,
+            MultipartFile courseImage,
+            List<MultipartFile> files,
+            List<String> types,
+            List<String> metaList
+    ) throws IOException {
+        S3Client s3Client = S3Client.builder()
+                .region(Region.of(region))
+                .credentialsProvider(
+                        StaticCredentialsProvider.create(
+                                AwsBasicCredentials.create(accessKey, secretKey)
+                        )
+                )
+                .build();
+
+        List<S3UploadResponse> responses = new ArrayList<>();
+
+        // Upload public course image
+        if (courseImage != null && !courseImage.isEmpty()) {
+            String imageKey = "public/courseImages/course" + courseId + "_" + courseImage.getOriginalFilename();
+
+            s3Client.putObject(
+                    PutObjectRequest.builder()
+                            .bucket(bucketName)
+                            .key(imageKey)
+                            .build(),
+                    RequestBody.fromBytes(courseImage.getBytes())
+            );
+
+            String imageUrl = "https://" + bucketName + ".s3." + region + ".amazonaws.com/" + imageKey;
+
+            responses.add(new S3UploadResponse("COURSE_IMAGE", imageUrl, new MetaInfo(null, null, courseId)));
+        }
+
+        // Upload private course content files
+        for (int i = 0; i < files.size(); i++) {
+            MultipartFile file = files.get(i);
+            String type = types.get(i);
+            String metaJson = metaList.get(i);
+
+            String key = "private/courseContent/" + type.toLowerCase() + "/course_" + courseId + "/" + file.getOriginalFilename();
+
+            s3Client.putObject(
+                    PutObjectRequest.builder()
+                            .bucket(bucketName)
+                            .key(key)
+                            .build(),
+                    RequestBody.fromBytes(file.getBytes())
+            );
+
+
+            MetaInfo meta = new ObjectMapper().readValue(metaJson, MetaInfo.class);
+            responses.add(new S3UploadResponse("COURSE_LECTURE", file.getOriginalFilename(), meta));
+        }
+
+        return responses;
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3UploadResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3UploadResponse.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3UploadResponse.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -0,0 +1,12 @@
+package com.shifterwebapp.shifter.external.upload;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+@Data
+public class S3UploadResponse {
+    public String type;
+    public String fileName;
+    public MetaInfo meta;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/external/upload/UploadController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/UploadController.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
+++ backend/src/main/java/com/shifterwebapp/shifter/external/upload/UploadController.java	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -0,0 +1,38 @@
+package com.shifterwebapp.shifter.external.upload;
+
+import com.shifterwebapp.shifter.Validate;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/upload")
+@RequiredArgsConstructor
+public class UploadController {
+
+    private final S3Service s3Service;
+    private final Validate validate;
+
+    @PostMapping(
+            value = "/course-image-and-content",
+            consumes = MediaType.MULTIPART_FORM_DATA_VALUE
+    )
+    public ResponseEntity<Void> uploadFiles(
+            @RequestParam("files") List<MultipartFile> files,
+            @RequestParam("types") List<String> types,
+            @RequestParam("meta") List<String> meta,
+            Authentication authentication
+    ) throws IOException {
+        validate.validateUserIsAdmin(authentication);
+
+//        s3Service.uploadFilesWithMeta(files, types, meta);
+        return ResponseEntity.ok().build();
+    }
+
+}
Index: ckend/src/main/java/com/shifterwebapp/shifter/upload/MetaInfo.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/MetaInfo.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.shifterwebapp.shifter.upload;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class MetaInfo {
-    private Integer contentPosition;
-    private Integer lecturePosition;
-    private Long courseId;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/upload/S3Controller.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/S3Controller.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package com.shifterwebapp.shifter.upload;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.course.service.CourseService;
-import com.shifterwebapp.shifter.courselecture.service.CourseLectureService;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Map;
-
-@RestController
-@RequestMapping("${api.base.path}/s3")
-@RequiredArgsConstructor
-public class S3Controller {
-
-    private final S3Service s3Service;
-    private final EnrollmentService enrollmentService;
-    private final CourseService courseService;
-    private final CourseLectureService courseLectureService;
-    private final Validate validate;
-
-    @GetMapping("/presigned-url")
-    public Map<String, String> getPresignedUrl(
-            @RequestParam Long courseId,
-            @RequestParam Long lectureId,
-            @RequestParam String fileName,
-            @RequestParam int expirySeconds,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-
-        if (!enrollmentService.isUserEnrolledInCourse(userId, courseId)) {
-            throw new AccessDeniedException("You do not have access to this course content.");
-        }
-
-        String contentType = courseLectureService.getContentType(fileName, courseId, lectureId);
-        if (contentType == null) {
-            throw new ResourceNotFoundException("Content type not found for the specified file.");
-        }
-
-        String key = "private/courseContent/" + contentType.toLowerCase() + "/course_" + courseId + "/" + fileName;
-        System.out.println(key);
-
-        if (!courseService.lectureFileExistsInCourse(courseId, fileName)) {
-            throw new ResourceNotFoundException("File does not exist in the course.");
-        }
-
-        String url = s3Service.generatePresignedGetUrl(key, expirySeconds).toString();
-        return Map.of("url", url);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/upload/S3Service.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/S3Service.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ 	(revision )
@@ -1,122 +1,0 @@
-package com.shifterwebapp.shifter.upload;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
-import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
-import software.amazon.awssdk.core.sync.RequestBody;
-import software.amazon.awssdk.regions.Region;
-import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.model.PutObjectRequest;
-import software.amazon.awssdk.services.s3.presigner.S3Presigner;
-import software.amazon.awssdk.services.s3.model.GetObjectRequest;
-import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
-import java.time.Duration;
-
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class S3Service {
-
-    @Value("${aws.access-key}")
-    private String accessKey;
-
-    @Value("${aws.secret-key}")
-    private String secretKey;
-
-    @Value("${aws.region}")
-    private String region;
-
-    @Value("${aws.s3.bucket-name}")
-    private String bucketName;
-
-    public URL generatePresignedGetUrl(String key, int expirySeconds) {
-        S3Presigner presigner = S3Presigner.builder()
-                .region(Region.of(region))
-                .credentialsProvider(StaticCredentialsProvider.create(
-                        AwsBasicCredentials.create(accessKey, secretKey)
-                ))
-                .build();
-
-        GetObjectRequest getObjectRequest = GetObjectRequest.builder()
-                .bucket(bucketName)
-                .key(key)
-                .build();
-
-        GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
-                .signatureDuration(Duration.ofSeconds(expirySeconds))
-                .getObjectRequest(getObjectRequest)
-                .build();
-
-        URL url = presigner.presignGetObject(presignRequest).url();
-        presigner.close();
-        return url;
-    }
-
-    public List<S3UploadResponse> uploadCourseImageAndFiles(
-            Long courseId,
-            MultipartFile courseImage,
-            List<MultipartFile> files,
-            List<String> types,
-            List<String> metaList
-    ) throws IOException {
-        S3Client s3Client = S3Client.builder()
-                .region(Region.of(region))
-                .credentialsProvider(
-                        StaticCredentialsProvider.create(
-                                AwsBasicCredentials.create(accessKey, secretKey)
-                        )
-                )
-                .build();
-
-        List<S3UploadResponse> responses = new ArrayList<>();
-
-        // Upload public course image
-        if (courseImage != null && !courseImage.isEmpty()) {
-            String imageKey = "public/courseImages/course" + courseId + "_" + courseImage.getOriginalFilename();
-
-            s3Client.putObject(
-                    PutObjectRequest.builder()
-                            .bucket(bucketName)
-                            .key(imageKey)
-                            .build(),
-                    RequestBody.fromBytes(courseImage.getBytes())
-            );
-
-            String imageUrl = "https://" + bucketName + ".s3." + region + ".amazonaws.com/" + imageKey;
-
-            responses.add(new S3UploadResponse("COURSE_IMAGE", imageUrl, new MetaInfo(null, null, courseId)));
-        }
-
-        // Upload private course content files
-        for (int i = 0; i < files.size(); i++) {
-            MultipartFile file = files.get(i);
-            String type = types.get(i);
-            String metaJson = metaList.get(i);
-
-            String key = "private/courseContent/" + type.toLowerCase() + "/course_" + courseId + "/" + file.getOriginalFilename();
-
-            s3Client.putObject(
-                    PutObjectRequest.builder()
-                            .bucket(bucketName)
-                            .key(key)
-                            .build(),
-                    RequestBody.fromBytes(file.getBytes())
-            );
-
-
-            MetaInfo meta = new ObjectMapper().readValue(metaJson, MetaInfo.class);
-            responses.add(new S3UploadResponse("COURSE_LECTURE", file.getOriginalFilename(), meta));
-        }
-
-        return responses;
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/upload/S3UploadResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/S3UploadResponse.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.shifterwebapp.shifter.upload;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@AllArgsConstructor
-@Data
-public class S3UploadResponse {
-    public String type;
-    public String fileName;
-    public MetaInfo meta;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/upload/UploadController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/UploadController.java	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ 	(revision )
@@ -1,39 +1,0 @@
-package com.shifterwebapp.shifter.upload;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.upload.S3Service;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.List;
-
-@RestController
-@RequestMapping("/api/upload")
-@RequiredArgsConstructor
-public class UploadController {
-
-    private final S3Service s3Service;
-    private final Validate validate;
-
-    @PostMapping(
-            value = "/course-image-and-content",
-            consumes = MediaType.MULTIPART_FORM_DATA_VALUE
-    )
-    public ResponseEntity<Void> uploadFiles(
-            @RequestParam("files") List<MultipartFile> files,
-            @RequestParam("types") List<String> types,
-            @RequestParam("meta") List<String> meta,
-            Authentication authentication
-    ) throws IOException {
-        validate.validateUserIsAdmin(authentication);
-
-//        s3Service.uploadFilesWithMeta(files, types, meta);
-        return ResponseEntity.ok().build();
-    }
-
-}
Index: backend/src/main/resources/application.properties
===================================================================
--- backend/src/main/resources/application.properties	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ backend/src/main/resources/application.properties	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -56,5 +56,7 @@
 spring.mail.username=${EMAIL_USERNAME}
 spring.mail.password=${EMAIL_PASSWORD}
+spring.mail.protocol=smtp
 spring.mail.properties.mail.smtp.auth=true
 spring.mail.properties.mail.smtp.starttls.enable=true
+spring.mail.properties.mail.smtp.starttls.required=true
 
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 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -57,5 +57,5 @@
                                 <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"
+                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
                                              style="display: block; border: 0;">
                                     </a>
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 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -56,5 +56,5 @@
                                 <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"
+                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
                                              style="display: block; border: 0;">
                                     </a>
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 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -44,5 +44,5 @@
                                 <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"
+                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
                                              style="display: block; border: 0;">
                                     </a>
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 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -56,5 +56,5 @@
                                 <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"
+                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
                                              style="display: block; border: 0;">
                                     </a>
Index: frontend/src/api/courseApi.ts
===================================================================
--- frontend/src/api/courseApi.ts	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/api/courseApi.ts	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -1,3 +1,3 @@
-import axios from "axios";
+import axios, {type AxiosResponse} from "axios";
 import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
 import type {CourseDetail} from "../models/javaObjects/CourseDetail.tsx";
@@ -86,3 +86,17 @@
 }
 
+type CertificateResponse = AxiosResponse<Blob>
 
+export const fetchCourseCertificateApi = async (courseId: number, accessToken: string): Promise<CertificateResponse> => {
+    const res = await axios.get(
+        `${backendUrl}/api/courses/${courseId}/certificate`, {
+            headers: {
+                Authorization: `Bearer ${accessToken}`
+            },
+            responseType: 'blob'
+        }
+    );
+    return res;
+}
+
+
Index: frontend/src/assets/icons/Certificate.tsx
===================================================================
--- frontend/src/assets/icons/Certificate.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
+++ frontend/src/assets/icons/Certificate.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -0,0 +1,23 @@
+
+export default function Certificate({className = "w-6 h-6 text-black", strokeWidth = 2}) {
+    return (
+        <svg xmlns="http://www.w3.org/2000/svg"
+             width="24"
+             height="24"
+             viewBox="0 0 24 24"
+             fill="none"
+             stroke="currentColor"
+             stroke-width={strokeWidth}
+             stroke-linecap="round"
+             stroke-linejoin="round"
+             className={`icon icon-tabler icons-tabler-outline icon-tabler-certificate ${className}`}>
+            <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
+            <path d="M15 15m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"/>
+            <path d="M13 17.5v4.5l2 -1.5l2 1.5v-4.5"/>
+            <path d="M10 19h-5a2 2 0 0 1 -2 -2v-10c0 -1.1 .9 -2 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -1 1.73"/>
+            <path d="M6 9l12 0"/>
+            <path d="M6 12l3 0"/>
+            <path d="M6 15l2 0"/>
+        </svg>
+    )
+}
Index: frontend/src/components/HeroHome.tsx
===================================================================
--- frontend/src/components/HeroHome.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/HeroHome.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -3,6 +3,8 @@
 import Silk from "../assets/animations/Silk.tsx";
 import CountUp from "react-countup";
+import {useAuthContext} from "../context/AuthContext.tsx";
 
 function HeroHome() {
+    const {user} = useAuthContext()
 
     return (
@@ -38,9 +40,9 @@
                     </div>
                     <Link
-                        to="/free-consultation"
+                        to={user?.hasUsedFreeConsultation ? "/contact" : "/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
+                        rounded-full text-black/90 px-12 py-3 bg-white font-bold border-2 border-black/20
                         w-fit shadow-md shadow-white/40">
-                        Book a Free Consultation
+                        {user?.hasUsedFreeConsultation ? "Get In Touch" : "Book a Free Consultation"}
                     </Link>
                 </div>
Index: frontend/src/components/NavbarLink.tsx
===================================================================
--- frontend/src/components/NavbarLink.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/components/NavbarLink.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -2,9 +2,9 @@
 
 const NavbarLink = ({to, label, className}: { to: string; label: string, className?: string; }) => (
-    <div className={`flex flex-col gap-0 overflow-clip group ${className}`}>
+    <div className={`flex flex-col gap-0 overflow-clip group w-fit ${className}`}>
         <Link to={to} className="transition-all duration-300 ease-in-out z-10">
             {label}
         </Link>
-        <hr className="relative -translate-x-40 group-hover:-translate-x-1/4 border-t-2 rounded-full transition-all duration-300 ease-in-out"/>
+        <hr className="relative -translate-x-60 group-hover:-translate-x-1/4 border-t-2 rounded-full transition-all duration-300 ease-in-out"/>
     </div>
 );
Index: frontend/src/context/AuthContext.tsx
===================================================================
--- frontend/src/context/AuthContext.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/context/AuthContext.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -91,6 +91,6 @@
         return refreshAccessTokenApi()
             .then(data => {
-                console.log(data.accessToken)
-                console.log(encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone))
+                // console.log(data.accessToken)
+                // console.log(encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone))
                 setAccessToken(data.accessToken);
                 setUser(data.user);
Index: frontend/src/hooks/useCourseLearn.tsx
===================================================================
--- frontend/src/hooks/useCourseLearn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/hooks/useCourseLearn.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -2,5 +2,5 @@
 import type {CourseFull} from "../models/javaObjects/CourseFull.tsx";
 import type {CourseLectureFull} from "../models/javaObjects/CourseLectureFull.tsx";
-import {fetchCourseFullApi} from "../api/courseApi.ts";
+import {fetchCourseCertificateApi, fetchCourseFullApi} from "../api/courseApi.ts";
 import {fetchPresignedUrlApi} from "../api/s3Api.ts";
 import {completeLectureApi, uncompleteLectureApi} from "../api/userCourseProgressApi.ts";
@@ -119,4 +119,44 @@
     };
 
+    const downloadCertificate = async () => {
+        try {
+            const response = await fetchCourseCertificateApi(Number(courseId || -1), accessToken || "");
+
+            const pdfBlob = response.data;
+
+            const disposition = response.headers['content-disposition'] || response.headers['Content-Disposition'];
+            let filename = `Shifter_Certificate_${courseId}.pdf`; // Fallback filename
+
+            if (disposition) {
+                const filenameMatch = disposition.match(/filename="(.+?)"|filename\*=UTF-8''(.+)/i);
+                if (filenameMatch) {
+                    // Prioritize the filename from the second capture group (UTF-8 encoding)
+                    // otherwise use the first group.
+                    filename = filenameMatch[2] || filenameMatch[1];
+
+                    // Clean up the filename if it was URL-encoded (common for UTF-8)
+                    if (filename.includes('%')) {
+                        filename = decodeURIComponent(filename);
+                    }
+                }
+            }
+
+            const url = window.URL.createObjectURL(pdfBlob);
+
+            const a = document.createElement('a');
+            a.href = url;
+            a.download = filename;
+            document.body.appendChild(a);
+            a.click();
+
+            window.URL.revokeObjectURL(url);
+            a.remove();
+
+        } catch (error) {
+            console.error("Error during certificate download:", error);
+            alert('Failed to download certificate. Check authentication or permissions.');
+        }
+    }
+
     const updateLecture = (progressId: number, isComplete: boolean) => {
         if (!course) return;
@@ -166,4 +206,5 @@
         updateLecture,
         triggerDownload,
+        downloadCertificate,
         getPresignedUrl,
         isLastLectureFinished,
Index: frontend/src/layout/Footer.tsx
===================================================================
--- frontend/src/layout/Footer.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/layout/Footer.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -80,4 +80,6 @@
                             <h3 className="text-white font-bold text-2xl mb-4">Contact</h3>
 
+                            <NavbarLink to={"/contact"} label={"Contact Us"}/>
+                            <hr className="border-t-1 border-white/40 rounded-full" />
                             <p>contact@shifter.com</p>
                             <div className="flex gap-2 items-center">
Index: frontend/src/pages/Academies.tsx
===================================================================
--- frontend/src/pages/Academies.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Academies.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -16,18 +16,19 @@
     const [message, setMessage] = React.useState("");
     const [loading, setLoading] = React.useState(false);
+    const [error, setError] = React.useState("");
+    const [isMessageSent, setIsMessageSent] = 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)
+        sendEmailApi(accessToken || "", "Academies Inquiry - " + subject, message)
             .then(() => {
-                console.log("Successfully sent email");
+                setIsMessageSent(true);
+                setError("")
             })
             .catch((err) => {
-                console.error("Error sending email:", err);
+                setError("We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com")
+                console.error("Error sending email for academies inquiry:", err);
             })
             .finally(() => setLoading(false));
@@ -39,8 +40,10 @@
             <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>
+                <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,
+                    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.
@@ -64,15 +67,15 @@
                         </div>
                         <div className="flex gap-4 items-center">
-                            <Mail size={24} color="var(--color-white)" />
+                            <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)" />
+                            <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" />
+                            <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>
@@ -110,17 +113,38 @@
                                 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
+                            {
+                                error && (
+                                    <p className="text-red-500 text-md font-medium text-center">
+                                        {error}
+                                    </p>
+                                )
+                            }
+                            {
+                                isMessageSent ? (
+                                    <div className="text-center w-full">
+                                        <h2 className="text-xl font-bold text-shifter mb-2">
+                                            Your message has been sent successfully!
+                                        </h2>
+                                        <p className="text-md font-medium text-black/80 max-w-xl mx-auto">
+                                            Thank you for reaching out to us. Our team will review your message and get
+                                            back to you as soon as possible.
+                                            Keep an eye on your <span className="font-semibold text-shifter">inbox for our reply</span>.
+                                        </p>
+                                    </div>
+                                ) : (
+                                    <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>
+                                            disabled={loading}
+                                            type="submit">
+                                            {loading ? "Sending..." : "Send Message"}
+                                        </button>
+                                        {
+                                            loading && <div className="loader"/>
+                                        }
+                                    </div>
+                                )}
                         </form>
                     </div>
Index: frontend/src/pages/Consulting.tsx
===================================================================
--- frontend/src/pages/Consulting.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Consulting.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -16,18 +16,19 @@
     const [message, setMessage] = React.useState("");
     const [loading, setLoading] = React.useState(false);
+    const [error, setError] = React.useState("");
+    const [isMessageSent, setIsMessageSent] = 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)
+        sendEmailApi(accessToken || "", "Consulting Inquiry - " + subject, message)
             .then(() => {
-                console.log("Successfully sent email");
+                setIsMessageSent(true);
+                setError("")
             })
             .catch((err) => {
-                console.error("Error sending email:", err);
+                setError("We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com")
+                console.error("Error sending email for consulting inquiry:", err);
             })
             .finally(() => setLoading(false));
@@ -39,8 +40,10 @@
             <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>
+                <h1 className="text-5xl font-bold">Personalized 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
+                    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.
@@ -64,15 +67,15 @@
                         </div>
                         <div className="flex gap-4 items-center">
-                            <Mail size={24} color="var(--color-white)" />
+                            <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)" />
+                            <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" />
+                            <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>
@@ -110,17 +113,38 @@
                                 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
+                            {
+                                error && (
+                                    <p className="text-red-500 text-md font-medium text-center">
+                                        {error}
+                                    </p>
+                                )
+                            }
+                            {
+                                isMessageSent ? (
+                                    <div className="text-center w-full">
+                                        <h2 className="text-xl font-bold text-shifter mb-2">
+                                            Your message has been sent successfully!
+                                        </h2>
+                                        <p className="text-md font-medium text-black/80 max-w-xl mx-auto">
+                                            Thank you for reaching out to us. Our team will review your message and get
+                                            back to you as soon as possible.
+                                            Keep an eye on your <span className="font-semibold text-shifter">inbox for our reply</span>.
+                                        </p>
+                                    </div>
+                                ) : (
+                                    <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>
+                                            disabled={loading}
+                                            type="submit">
+                                            {loading ? "Sending..." : "Send Message"}
+                                        </button>
+                                        {
+                                            loading && <div className="loader"/>
+                                        }
+                                    </div>
+                                )}
                         </form>
                     </div>
Index: frontend/src/pages/Contact.tsx
===================================================================
--- frontend/src/pages/Contact.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Contact.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -16,20 +16,23 @@
     const [message, setMessage] = React.useState("");
     const [loading, setLoading] = React.useState(false);
+    const [error, setError] = React.useState("");
+    const [isMessageSent, setIsMessageSent] = 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");
+                setIsMessageSent(true);
+                setError("")
             })
             .catch((err) => {
-                console.error("Error sending email:", err);
+                setError("We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com")
+                console.error("Error sending email for contact form:", err);
             })
-            .finally(() => setLoading(false));
+            .finally(() => {
+                setLoading(false)
+            });
     }
 
@@ -107,17 +110,38 @@
                                 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
+                            {
+                                error && (
+                                    <p className="text-red-500 text-md font-medium text-center">
+                                        {error}
+                                    </p>
+                                )
+                            }
+                            {
+                                isMessageSent ? (
+                                    <div className="text-center w-full">
+                                        <h2 className="text-xl font-bold text-shifter mb-2">
+                                            Your message has been sent successfully!
+                                        </h2>
+                                        <p className="text-md font-medium text-black/80 max-w-xl mx-auto">
+                                            Thank you for reaching out to us. Our team will review your message and get back to you as soon as possible.
+                                            Keep an eye on your <span className="font-semibold text-shifter">inbox for our reply</span>.
+                                        </p>
+                                    </div>
+                                ) : (
+                                    <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>
+                                            disabled={loading}
+                                            type="submit">
+                                            {loading ? "Sending..." : "Send Message"}
+                                        </button>
+                                        {
+                                            loading && <div className="loader" />
+                                        }
+                                    </div>
+                                )
+                            }
                         </form>
                     </div>
@@ -173,4 +197,5 @@
             <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
             <textarea
+                required={true}
                 onChange={onChange}
                 rows={rows}
Index: frontend/src/pages/CourseLearn.tsx
===================================================================
--- frontend/src/pages/CourseLearn.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/CourseLearn.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -10,4 +10,5 @@
 import NavbarLearn from "../layout/NavbarLearn.tsx";
 import ModalReviewCourse from "../components/ModalReviewCourse.tsx";
+import Certificate from "../assets/icons/Certificate.tsx";
 
 function CourseLearn() {
@@ -26,4 +27,5 @@
         updateLecture,
         triggerDownload,
+        downloadCertificate,
         isLastLectureFinished,
         setIsLastLectureFinished,
@@ -94,9 +96,12 @@
                                             setShowReviewModal(true);
                                         }}
-                                        btnText={<>
-                                            <StarFilled className="text-gold h-6 "/>
-                                            Leave a Review
-                                        </>}
+                                        btnText={
+                                            <div className="flex items-center gap-2">
+                                                <StarFilled className="text-gold h-6 "/>
+                                                Leave a Review
+                                            </div>
+                                        }
                                         btnShow={(course?.rating ?? 0) === 0}
+                                        downloadCertificate={downloadCertificate}
                                     />
                                 )
@@ -129,5 +134,5 @@
                                                 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`}
+                                                bg-shifter text-white text-lg px-8 py-2 rounded-md shadow-md border-2 border-white/40 shadow-shifter/40`}
                                             >
                                                 {
@@ -245,10 +250,12 @@
 }
 
-function LastLectureFinished({title, onClick, btnText, btnShow}: {
+function LastLectureFinished({title, onClick, btnText, btnShow, downloadCertificate}: {
     title: string,
     onClick: () => void,
     btnText: string | JSX.Element,
     btnShow: boolean
+    downloadCertificate?: () => void
 }) {
+    const [loading, setLoading] = useState<boolean>(false);
 
     return (
@@ -261,8 +268,41 @@
                             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">
+                            flex gap-2 items-center justify-center text-lg   font-bold px-8 py-2 rounded-md border-1 border-shifter cursor-pointer">
                             {btnText}
                         </button>
-                    )}
+                    )
+                }
+                {
+                    downloadCertificate && (
+                        <button
+                            disabled={loading}
+                            onClick={async () => {
+                                setLoading(true);
+                                try {
+                                    await downloadCertificate()
+                                } catch (error) {
+                                    console.error("Certificate download failed:", error);
+                                } finally {
+                                    setLoading(false);
+                                }
+                            }}
+                            className="disabled:cursor-not-allowed disabled:opacity-60 hover:bg-shifter/10
+                            flex gap-2 items-center justify-center text-lg   font-bold px-8 py-2 rounded-md border-1 border-shifter cursor-pointer">
+                            {
+                                loading ? (
+                                    <>
+                                        Downloading...
+                                        <div className="loader"/>
+                                    </>
+                                ) : (
+                                    <div className="flex items-center gap-2">
+                                        <Certificate className="text-black h-6 "/>
+                                        Download Certificate
+                                    </div>
+                                )
+                            }
+                        </button>
+                    )
+                }
                 <Link to="/learn"
                       className="text-lg font-bold text-shifter underline hover:text-shifter/60">
Index: frontend/src/pages/FreeConsultation.tsx
===================================================================
--- frontend/src/pages/FreeConsultation.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/FreeConsultation.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -3,4 +3,6 @@
 import {fetchExpertFreeTimeSlotsApi, scheduleMeetingApi} from "../api/meetingApi.ts";
 import type {UserMeetingInfoRequest} from "../models/UserMeetingInfoRequest.tsx";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-expect-error
 import ShifterArrow from "../../public/Shifter-Arrow-White.png"
 
@@ -39,5 +41,8 @@
             .catch(error => {
                 console.error("Error scheduling meeting:", error);
-                setError("Failed to schedule the meeting. Please try again later or contact support.");
+                if (error.response.data.message === "User has already used free consultation")
+                    setError('We couldn’t schedule your meeting. It appears you’ve already used your free consultation. Feel free to get in touch with us through our Contact page for more options.');
+                else
+                    setError("Failed to schedule the meeting. Please try again later or contact support.");
             })
             .finally(() => setLoadingSubmitForm(false));
Index: frontend/src/pages/Mentoring.tsx
===================================================================
--- frontend/src/pages/Mentoring.tsx	(revision 6758036ecbdac75c2b93a2f138427a3c46323fa6)
+++ frontend/src/pages/Mentoring.tsx	(revision 1a2bc8c8a1044bbf5be8f21724aa6fc0376a6602)
@@ -16,18 +16,19 @@
     const [message, setMessage] = React.useState("");
     const [loading, setLoading] = React.useState(false);
+    const [error, setError] = React.useState("");
+    const [isMessageSent, setIsMessageSent] = 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)
+        sendEmailApi(accessToken || "", "Mentoring Inquiry - " + subject, message)
             .then(() => {
-                console.log("Successfully sent email");
+                setIsMessageSent(true);
+                setError("");
             })
             .catch((err) => {
-                console.error("Error sending email:", err);
+                setError("We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com")
+                console.error("Error sending email for mentoring inquiry:", err);
             })
             .finally(() => setLoading(false));
@@ -109,17 +110,38 @@
                                 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
+                            {
+                                error && (
+                                    <p className="text-red-500 text-md font-medium text-center">
+                                        {error}
+                                    </p>
+                                )
+                            }
+                            {
+                                isMessageSent ? (
+                                    <div className="text-center w-full">
+                                        <h2 className="text-xl font-bold text-shifter mb-2">
+                                            Your message has been sent successfully!
+                                        </h2>
+                                        <p className="text-md font-medium text-black/80 max-w-xl mx-auto">
+                                            Thank you for reaching out to us. Our team will review your message and get back to you as soon as possible.
+                                            Keep an eye on your <span className="font-semibold text-shifter">inbox for our reply</span>.
+                                        </p>
+                                    </div>
+                                ) : (
+                                    <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>
+                                            disabled={loading}
+                                            type="submit">
+                                            {loading ? "Sending..." : "Send Message"}
+                                        </button>
+                                        {
+                                            loading && <div className="loader" />
+                                        }
+                                    </div>
+                                )
+                            }
                         </form>
                     </div>
