diff --git a/build.gradle b/build.gradle
index d9f62736f..e12cbd331 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,7 +12,7 @@ plugins {
 import com.github.jk1.license.render.*
 
 group = 'stirling.software'
-version = '0.19.1'
+version = '0.20.0'
 sourceCompatibility = '17'
 
 repositories {
@@ -137,11 +137,11 @@ dependencies {
         exclude group: 'commons-logging', module: 'commons-logging'
     }
     
-    implementation ('org.apache.pdfbox:pdfbox:2.0.30'){
+    implementation ('org.apache.pdfbox:pdfbox:3.0.1'){
         exclude group: 'commons-logging', module: 'commons-logging'
     }
     
-    implementation ('org.apache.pdfbox:xmpbox:2.0.30'){
+    implementation ('org.apache.pdfbox:xmpbox:3.0.1'){
         exclude group: 'commons-logging', module: 'commons-logging'
     }
     
@@ -164,6 +164,9 @@ dependencies {
 tasks.withType(JavaCompile) {
     dependsOn 'spotlessApply'
 }
+compileJava {
+    options.compilerArgs << '-parameters'
+}
 
 task writeVersion {
     def propsFile = file('src/main/resources/version.properties')
diff --git a/src/main/java/stirling/software/SPDF/controller/api/CropController.java b/src/main/java/stirling/software/SPDF/controller/api/CropController.java
index a547d89f6..42addb267 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/CropController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/CropController.java
@@ -1,13 +1,14 @@
 package stirling.software.SPDF.controller.api;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.multipdf.LayerUtility;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
 import org.slf4j.Logger;
@@ -37,9 +38,7 @@ public class CropController {
             description =
                     "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO")
     public ResponseEntity<byte[]> cropPdf(@ModelAttribute CropPdfForm form) throws IOException {
-
-        PDDocument sourceDocument =
-                PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()));
+        PDDocument sourceDocument = Loader.loadPDF(form.getFileInput().getBytes());
 
         PDDocument newDocument = new PDDocument();
 
@@ -53,7 +52,8 @@ public class CropController {
             // Create a new page with the size of the source page
             PDPage newPage = new PDPage(sourcePage.getMediaBox());
             newDocument.addPage(newPage);
-            PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage);
+            PDPageContentStream contentStream =
+                    new PDPageContentStream(newDocument, newPage, AppendMode.OVERWRITE, true, true);
 
             // Import the source page as a form XObject
             PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
index 70b79191e..ad742137b 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
@@ -1,16 +1,17 @@
 package stirling.software.SPDF.controller.api;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
 
-import org.apache.pdfbox.io.MemoryUsageSetting;
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.multipdf.PDFMergerUtility;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
@@ -27,6 +28,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 
 import stirling.software.SPDF.model.api.general.MergePdfsRequest;
+import stirling.software.SPDF.utils.GeneralUtils;
 import stirling.software.SPDF.utils.WebResponseUtils;
 
 @RestController
@@ -84,8 +86,8 @@ public class MergeController {
                 };
             case "byPDFTitle":
                 return (file1, file2) -> {
-                    try (PDDocument doc1 = PDDocument.load(file1.getInputStream());
-                            PDDocument doc2 = PDDocument.load(file2.getInputStream())) {
+                    try (PDDocument doc1 = Loader.loadPDF(file1.getBytes());
+                            PDDocument doc2 = Loader.loadPDF(file2.getBytes())) {
                         String title1 = doc1.getDocumentInformation().getTitle();
                         String title2 = doc2.getDocumentInformation().getTitle();
                         return title1.compareTo(title2);
@@ -106,6 +108,7 @@ public class MergeController {
                     "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO")
     public ResponseEntity<byte[]> mergePdfs(@ModelAttribute MergePdfsRequest form)
             throws IOException {
+        List<File> filesToDelete = new ArrayList<File>();
         try {
             MultipartFile[] files = form.getFileInput();
             Arrays.sort(files, getSortComparator(form.getSortType()));
@@ -113,20 +116,27 @@ public class MergeController {
             PDFMergerUtility mergedDoc = new PDFMergerUtility();
             ByteArrayOutputStream docOutputstream = new ByteArrayOutputStream();
 
-            for (MultipartFile file : files) {
-                mergedDoc.addSource(new ByteArrayInputStream(file.getBytes()));
+            for (MultipartFile multipartFile : files) {
+                File tempFile = GeneralUtils.convertMultipartFileToFile(multipartFile);
+                filesToDelete.add(tempFile);
+                mergedDoc.addSource(tempFile);
             }
 
             mergedDoc.setDestinationFileName(
                     files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf");
             mergedDoc.setDestinationStream(docOutputstream);
-            mergedDoc.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
+
+            mergedDoc.mergeDocuments(null);
 
             return WebResponseUtils.bytesToWebResponse(
                     docOutputstream.toByteArray(), mergedDoc.getDestinationFileName());
         } catch (Exception ex) {
             logger.error("Error in merge pdf process", ex);
             throw ex;
+        } finally {
+            for (File file : filesToDelete) {
+                file.delete();
+            }
         }
     }
 }
diff --git a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
index 521275714..ee6c27894 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
@@ -4,6 +4,7 @@ import java.awt.Color;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.multipdf.LayerUtility;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
@@ -57,7 +58,7 @@ public class MultiPageLayoutController {
                         : (int) Math.sqrt(pagesPerSheet);
         int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet);
 
-        PDDocument sourceDocument = PDDocument.load(file.getInputStream());
+        PDDocument sourceDocument = Loader.loadPDF(file.getBytes());
         PDDocument newDocument = new PDDocument();
         PDPage newPage = new PDPage(PDRectangle.A4);
         newDocument.addPage(newPage);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java
index f6099c3a6..05cf12635 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java
@@ -8,6 +8,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.multipdf.Overlay;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.springframework.http.MediaType;
@@ -53,7 +54,7 @@ public class PdfOverlayController {
             // "FixedRepeatOverlay"
             int[] counts = request.getCounts(); // Used for FixedRepeatOverlay mode
 
-            try (PDDocument basePdf = PDDocument.load(baseFile.getInputStream());
+            try (PDDocument basePdf = Loader.loadPDF(baseFile.getBytes());
                     Overlay overlay = new Overlay()) {
                 Map<Integer, String> overlayGuide =
                         prepareOverlayGuide(
@@ -131,7 +132,7 @@ public class PdfOverlayController {
                 overlayFileIndex = (overlayFileIndex + 1) % overlayFiles.length;
             }
 
-            try (PDDocument overlayPdf = PDDocument.load(overlayFiles[overlayFileIndex])) {
+            try (PDDocument overlayPdf = Loader.loadPDF(overlayFiles[overlayFileIndex])) {
                 PDDocument singlePageDocument = new PDDocument();
                 singlePageDocument.addPage(overlayPdf.getPage(pageCountInCurrentOverlay));
                 File tempFile = File.createTempFile("overlay-page-", ".pdf");
@@ -147,7 +148,7 @@ public class PdfOverlayController {
     }
 
     private int getNumberOfPages(File file) throws IOException {
-        try (PDDocument doc = PDDocument.load(file)) {
+        try (PDDocument doc = Loader.loadPDF(file)) {
             return doc.getNumberOfPages();
         }
     }
@@ -159,7 +160,7 @@ public class PdfOverlayController {
             File overlayFile = overlayFiles[(basePageIndex - 1) % overlayFiles.length];
 
             // Load the overlay document to check its page count
-            try (PDDocument overlayPdf = PDDocument.load(overlayFile)) {
+            try (PDDocument overlayPdf = Loader.loadPDF(overlayFile)) {
                 int overlayPageCount = overlayPdf.getNumberOfPages();
                 if ((basePageIndex - 1) % overlayPageCount < overlayPageCount) {
                     overlayGuide.put(basePageIndex, overlayFile.getAbsolutePath());
@@ -181,7 +182,7 @@ public class PdfOverlayController {
             int repeatCount = counts[i];
 
             // Load the overlay document to check its page count
-            try (PDDocument overlayPdf = PDDocument.load(overlayFile)) {
+            try (PDDocument overlayPdf = Loader.loadPDF(overlayFile)) {
                 int overlayPageCount = overlayPdf.getNumberOfPages();
                 for (int j = 0; j < repeatCount; j++) {
                     for (int page = 0; page < overlayPageCount; page++) {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java
index 8c31bf3cc..1737d543c 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.slf4j.Logger;
@@ -42,7 +43,7 @@ public class RearrangePagesPDFController {
         MultipartFile pdfFile = request.getFileInput();
         String pagesToDelete = request.getPageNumbers();
 
-        PDDocument document = PDDocument.load(pdfFile.getBytes());
+        PDDocument document = Loader.loadPDF(pdfFile.getBytes());
 
         // Split the page order string into an array of page numbers or range of numbers
         String[] pageOrderArr = pagesToDelete.split(",");
@@ -179,7 +180,7 @@ public class RearrangePagesPDFController {
         String sortType = request.getCustomMode();
         try {
             // Load the input PDF
-            PDDocument document = PDDocument.load(pdfFile.getInputStream());
+            PDDocument document = Loader.loadPDF(pdfFile.getBytes());
 
             // Split the page order string into an array of page numbers or range of numbers
             String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0];
diff --git a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java
index 883beb5d9..6f8613f84 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java
@@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api;
 
 import java.io.IOException;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageTree;
@@ -37,7 +38,7 @@ public class RotationController {
         MultipartFile pdfFile = request.getFileInput();
         Integer angle = request.getAngle();
         // Load the PDF document
-        PDDocument document = PDDocument.load(pdfFile.getBytes());
+        PDDocument document = Loader.loadPDF(pdfFile.getBytes());
 
         // Get the list of pages in the document
         PDPageTree pages = document.getPages();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java
index 0dcec05c4..da55bad5a 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java
@@ -5,6 +5,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.multipdf.LayerUtility;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
@@ -66,7 +67,7 @@ public class ScalePagesController {
 
         PDRectangle targetSize = sizeMap.get(targetPDRectangle);
 
-        PDDocument sourceDocument = PDDocument.load(file.getBytes());
+        PDDocument sourceDocument = Loader.loadPDF(file.getBytes());
         PDDocument outputDocument = new PDDocument();
 
         int totalPages = sourceDocument.getNumberOfPages();
@@ -83,7 +84,11 @@ public class ScalePagesController {
 
             PDPageContentStream contentStream =
                     new PDPageContentStream(
-                            outputDocument, newPage, PDPageContentStream.AppendMode.APPEND, true);
+                            outputDocument,
+                            newPage,
+                            PDPageContentStream.AppendMode.APPEND,
+                            true,
+                            true);
 
             float x = (targetSize.getWidth() - sourceSize.getWidth() * scale) / 2;
             float y = (targetSize.getHeight() - sourceSize.getHeight() * scale) / 2;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
index a521769e5..3dbb93354 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java
@@ -2,7 +2,6 @@ package stirling.software.SPDF.controller.api;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -11,6 +10,7 @@ import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.slf4j.Logger;
@@ -46,8 +46,8 @@ public class SplitPDFController {
         MultipartFile file = request.getFileInput();
         String pages = request.getPageNumbers();
         // open the pdf document
-        InputStream inputStream = file.getInputStream();
-        PDDocument document = PDDocument.load(inputStream);
+
+        PDDocument document = Loader.loadPDF(file.getBytes());
 
         List<Integer> pageNumbers = request.getPageNumbersList(document);
         if (!pageNumbers.contains(document.getNumberOfPages() - 1))
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
index 71dca3715..de3e5a4b0 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
@@ -9,10 +9,12 @@ import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.multipdf.LayerUtility;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
 import org.apache.pdfbox.util.Matrix;
@@ -45,7 +47,7 @@ public class SplitPdfBySectionsController {
         List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<>();
 
         MultipartFile file = request.getFileInput();
-        PDDocument sourceDocument = PDDocument.load(file.getInputStream());
+        PDDocument sourceDocument = Loader.loadPDF(file.getBytes());
 
         // Process the PDF based on split parameters
         int horiz = request.getHorizontalDivisions() + 1;
@@ -115,13 +117,13 @@ public class SplitPdfBySectionsController {
                                     document, document.getPages().indexOf(originalPage));
 
                     try (PDPageContentStream contentStream =
-                            new PDPageContentStream(subDoc, subPage)) {
+                            new PDPageContentStream(
+                                    subDoc, subPage, AppendMode.APPEND, true, true)) {
                         // Set clipping area and position
                         float translateX = -subPageWidth * i;
-                        float translateY = height - subPageHeight * (verticalDivisions - j);
-
-                        // Code for google Docs pdfs..
-                        // float translateY = -subPageHeight * (verticalDivisions - 1 - j);
+                       
+                        //float translateY = height - subPageHeight * (verticalDivisions - j);
+                        float translateY = -subPageHeight * (verticalDivisions - 1 - j);
 
                         contentStream.saveGraphicsState();
                         contentStream.addRect(0, 0, subPageWidth, subPageHeight);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java
index 28ac46733..4bfde8435 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java
@@ -9,6 +9,7 @@ import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.springframework.http.MediaType;
@@ -42,7 +43,7 @@ public class SplitPdfBySizeController {
         List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<ByteArrayOutputStream>();
 
         MultipartFile file = request.getFileInput();
-        PDDocument sourceDocument = PDDocument.load(file.getInputStream());
+        PDDocument sourceDocument = Loader.loadPDF(file.getBytes());
 
         // 0 = size, 1 = page count, 2 = doc count
         int type = request.getSplitType();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java
index cd971b55d..30406ec2a 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java
@@ -4,6 +4,7 @@ import java.awt.geom.AffineTransform;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.multipdf.LayerUtility;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
@@ -40,7 +41,7 @@ public class ToSinglePageController {
             throws IOException {
 
         // Load the source document
-        PDDocument sourceDocument = PDDocument.load(request.getFileInput().getInputStream());
+        PDDocument sourceDocument = Loader.loadPDF(request.getFileInput().getBytes());
 
         // Calculate total height and max width
         float totalHeight = 0;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java
index 89e81c99a..ce15d19c0 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java
@@ -13,6 +13,7 @@ import org.springframework.security.core.Authentication;
 import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,13 +21,18 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.springframework.web.servlet.view.RedirectView;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import stirling.software.SPDF.config.security.UserService;
 import stirling.software.SPDF.model.Role;
 import stirling.software.SPDF.model.User;
+import stirling.software.SPDF.model.api.user.UpdateUserDetails;
+import stirling.software.SPDF.model.api.user.UsernameAndPass;
 
 @Controller
+@Tag(name = "User", description = "User APIs")
 @RequestMapping("/api/v1/user")
 public class UserController {
 
@@ -34,14 +40,13 @@ public class UserController {
 
     @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
     @PostMapping("/register")
-    public String register(
-            @RequestParam String username, @RequestParam String password, Model model) {
-        if (userService.usernameExists(username)) {
+    public String register(@ModelAttribute UsernameAndPass requestModel, Model model) {
+        if (userService.usernameExists(requestModel.getUsername())) {
             model.addAttribute("error", "Username already exists");
             return "register";
         }
 
-        userService.saveUser(username, password);
+        userService.saveUser(requestModel.getUsername(), requestModel.getPassword());
         return "redirect:/login?registered=true";
     }
 
@@ -49,12 +54,15 @@ public class UserController {
     @PostMapping("/change-username-and-password")
     public RedirectView changeUsernameAndPassword(
             Principal principal,
-            @RequestParam String currentPassword,
-            @RequestParam String newUsername,
-            @RequestParam String newPassword,
+            @ModelAttribute UpdateUserDetails requestModel,
             HttpServletRequest request,
             HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
+
+        String currentPassword = requestModel.getPassword();
+        String newPassword = requestModel.getNewPassword();
+        String newUsername = requestModel.getNewUsername();
+
         if (principal == null) {
             return new RedirectView("/change-creds?messageType=notAuthenticated");
         }
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java
index c5b9ea8de..6bd9d8b99 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java
@@ -1,10 +1,10 @@
 package stirling.software.SPDF.controller.api.converters;
 
-import java.io.ByteArrayInputStream;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.slf4j.Logger;
@@ -44,8 +44,7 @@ public class ExtractController {
         ArrayList<String> tableData = new ArrayList<>();
         int columnsCount = 0;
 
-        try (PDDocument document =
-                PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) {
+        try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
             final double res = 72; // PDF units are at 72 DPI
             PDFTableStripper stripper = new PDFTableStripper();
             PDPage pdPage = document.getPage(form.getPageId() - 1);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
index 967978a78..370aa6d78 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
@@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.filters;
 
 import java.io.IOException;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
@@ -39,7 +40,7 @@ public class FilterController {
         String text = request.getText();
         String pageNumber = request.getPageNumbers();
 
-        PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
+        PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes());
         if (PdfUtils.hasText(pdfDocument, pageNumber, text))
             return WebResponseUtils.pdfDocToWebResponse(
                     pdfDocument, inputFile.getOriginalFilename());
@@ -56,7 +57,7 @@ public class FilterController {
         MultipartFile inputFile = request.getFileInput();
         String pageNumber = request.getPageNumbers();
 
-        PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
+        PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes());
         if (PdfUtils.hasImages(pdfDocument, pageNumber))
             return WebResponseUtils.pdfDocToWebResponse(
                     pdfDocument, inputFile.getOriginalFilename());
@@ -73,7 +74,7 @@ public class FilterController {
         String pageCount = request.getPageCount();
         String comparator = request.getComparator();
         // Load the PDF
-        PDDocument document = PDDocument.load(inputFile.getInputStream());
+        PDDocument document = Loader.loadPDF(inputFile.getBytes());
         int actualPageCount = document.getNumberOfPages();
 
         boolean valid = false;
@@ -107,7 +108,7 @@ public class FilterController {
         String comparator = request.getComparator();
 
         // Load the PDF
-        PDDocument document = PDDocument.load(inputFile.getInputStream());
+        PDDocument document = Loader.loadPDF(inputFile.getBytes());
 
         PDPage firstPage = document.getPage(0);
         PDRectangle actualPageSize = firstPage.getMediaBox();
@@ -183,7 +184,7 @@ public class FilterController {
         String comparator = request.getComparator();
 
         // Load the PDF
-        PDDocument document = PDDocument.load(inputFile.getInputStream());
+        PDDocument document = Loader.loadPDF(inputFile.getBytes());
 
         // Get the rotation of the first page
         PDPage firstPage = document.getPage(0);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
index e81ef1e1b..9a78e4d10 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
@@ -5,6 +5,7 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.text.PDFTextStripper;
 import org.apache.pdfbox.text.TextPosition;
@@ -43,7 +44,7 @@ public class AutoRenameController {
         MultipartFile file = request.getFileInput();
         Boolean useFirstTextAsFallback = request.isUseFirstTextAsFallback();
 
-        PDDocument document = PDDocument.load(file.getInputStream());
+        PDDocument document = Loader.loadPDF(file.getBytes());
         PDFTextStripper reader =
                 new PDFTextStripper() {
                     class LineInfo {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
index 9b447fcb3..b793fc3e8 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
@@ -5,7 +5,6 @@ import java.awt.image.DataBufferByte;
 import java.awt.image.DataBufferInt;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -13,6 +12,7 @@ import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.PDFRenderer;
 import org.springframework.http.MediaType;
@@ -54,8 +54,7 @@ public class AutoSplitPdfController {
         MultipartFile file = request.getFileInput();
         boolean duplexMode = request.isDuplexMode();
 
-        InputStream inputStream = file.getInputStream();
-        PDDocument document = PDDocument.load(inputStream);
+        PDDocument document = Loader.loadPDF(file.getBytes());
         PDFRenderer pdfRenderer = new PDFRenderer(document);
 
         List<PDDocument> splitDocuments = new ArrayList<>();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java
index 036d6a661..8a17e3def 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java
@@ -13,6 +13,7 @@ import java.util.stream.IntStream;
 
 import javax.imageio.ImageIO;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageTree;
@@ -53,7 +54,7 @@ public class BlankPageController {
 
         PDDocument document = null;
         try {
-            document = PDDocument.load(inputFile.getInputStream());
+            document = Loader.loadPDF(inputFile.getBytes());
             PDPageTree pages = document.getDocumentCatalog().getPages();
             PDFTextStripper textStripper = new PDFTextStripper();
 
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
index fd9a0460a..2b8a15413 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
@@ -13,6 +13,7 @@ import java.util.List;
 import javax.imageio.ImageIO;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
@@ -147,7 +148,7 @@ public class CompressController {
         if (expectedOutputSize != null && autoMode) {
             long outputFileSize = Files.size(tempOutputFile);
             if (outputFileSize > expectedOutputSize) {
-                try (PDDocument doc = PDDocument.load(new File(tempOutputFile.toString()))) {
+                try (PDDocument doc = Loader.loadPDF(new File(tempOutputFile.toString()))) {
                     long previousFileSize = 0;
                     double scaleFactor = 1.0;
                     while (true) {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
index 257f4d520..510607e80 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
@@ -1,7 +1,6 @@
 package stirling.software.SPDF.controller.api.misc;
 
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -17,6 +16,7 @@ import java.util.zip.ZipOutputStream;
 import javax.imageio.ImageIO;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.PDFRenderer;
 import org.slf4j.Logger;
@@ -76,8 +76,7 @@ public class ExtractImageScansController {
         // Check if input file is a PDF
         if (extension.equalsIgnoreCase("pdf")) {
             // Load PDF document
-            try (PDDocument document =
-                    PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) {
+            try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
                 PDFRenderer pdfRenderer = new PDFRenderer(document);
                 int pageCount = document.getNumberOfPages();
                 images = new ArrayList<>();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
index f436d9f6f..2ebc8f6c9 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
@@ -14,6 +14,7 @@ import java.util.zip.ZipOutputStream;
 
 import javax.imageio.ImageIO;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
@@ -53,7 +54,7 @@ public class ExtractImagesController {
 
         System.out.println(
                 System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format);
-        PDDocument document = PDDocument.load(file.getBytes());
+        PDDocument document = Loader.loadPDF(file.getBytes());
 
         // Create ByteArrayOutputStream to write zip file to byte array
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java
index e9885f1e7..cb8db7d35 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java
@@ -16,6 +16,7 @@ import java.util.Random;
 
 import javax.imageio.ImageIO;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
@@ -57,7 +58,7 @@ public class FakeScanControllerWIP {
     public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile request) throws IOException {
         MultipartFile inputFile = request.getFileInput();
 
-        PDDocument document = PDDocument.load(inputFile.getBytes());
+        PDDocument document = Loader.loadPDF(inputFile.getBytes());
         PDFRenderer pdfRenderer = new PDFRenderer(document);
         for (int page = 0; page < document.getNumberOfPages(); ++page) {
             BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
index 62783dc42..a5eb95ca9 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
@@ -7,6 +7,7 @@ import java.util.Calendar;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDDocumentInformation;
@@ -67,7 +68,7 @@ public class MetadataController {
             allRequestParams = new java.util.HashMap<String, String>();
         }
         // Load the PDF file into a PDDocument
-        PDDocument document = PDDocument.load(pdfFile.getBytes());
+        PDDocument document = Loader.loadPDF(pdfFile.getBytes());
 
         // Get the document information from the PDF
         PDDocumentInformation info = document.getDocumentInformation();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
index 0ae9a49ee..79f62c5ad 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
@@ -4,11 +4,13 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.apache.pdfbox.pdmodel.font.Standard14Fonts;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.MediaType;
@@ -48,7 +50,7 @@ public class PageNumbersController {
         String customText = request.getCustomText();
         int pageNumber = startingNumber;
         byte[] fileBytes = file.getBytes();
-        PDDocument document = PDDocument.load(fileBytes);
+        PDDocument document = Loader.loadPDF(fileBytes);
 
         float marginFactor;
         switch (customMargin.toLowerCase()) {
@@ -71,7 +73,6 @@ public class PageNumbersController {
         }
 
         float fontSize = 12.0f;
-        PDType1Font font = PDType1Font.HELVETICA;
         if (pagesToNumber == null || pagesToNumber.length() == 0) {
             pagesToNumber = "all";
         }
@@ -127,9 +128,9 @@ public class PageNumbersController {
 
             PDPageContentStream contentStream =
                     new PDPageContentStream(
-                            document, page, PDPageContentStream.AppendMode.APPEND, true);
+                            document, page, PDPageContentStream.AppendMode.APPEND, true, true);
             contentStream.beginText();
-            contentStream.setFont(font, fontSize);
+            contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.HELVETICA), fontSize);
             contentStream.newLineAtOffset(x, y);
             contentStream.showText(text);
             contentStream.endText();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
index ed7852fab..47a13d0cf 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
@@ -3,6 +3,7 @@ package stirling.software.SPDF.controller.api.misc;
 import java.nio.charset.StandardCharsets;
 import java.util.Map;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.common.PDNameTreeNode;
 import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
@@ -36,7 +37,7 @@ public class ShowJavascript {
         MultipartFile inputFile = request.getFileInput();
         String script = "";
 
-        try (PDDocument document = PDDocument.load(inputFile.getInputStream())) {
+        try (PDDocument document = Loader.loadPDF(inputFile.getBytes())) {
 
             if (document.getDocumentCatalog() != null
                     && document.getDocumentCatalog().getNames() != null) {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
index 1ead1a97b..f7c7390eb 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
@@ -16,6 +16,7 @@ import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.util.Calendar;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.examples.signature.CreateSignatureBase;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
@@ -132,7 +133,7 @@ public class CertSignController {
             String name,
             String location,
             String reason) {
-        try (PDDocument doc = PDDocument.load(input)) {
+        try (PDDocument doc = Loader.loadPDF(input)) {
             PDSignature signature = new PDSignature();
             signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
             signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java
index f0bd84385..9926da559 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java
@@ -11,11 +11,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.pdfbox.cos.COSDocument;
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.cos.COSInputStream;
 import org.apache.pdfbox.cos.COSName;
-import org.apache.pdfbox.cos.COSObject;
-import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.cos.COSString;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
@@ -87,7 +85,7 @@ public class GetInfoOnPDF {
     @Operation(summary = "Summary here", description = "desc. Input:PDF Output:JSON Type:SISO")
     public ResponseEntity<byte[]> getPdfInfo(@ModelAttribute PDFFile request) throws IOException {
         MultipartFile inputFile = request.getFileInput();
-        try (PDDocument pdfBoxDoc = PDDocument.load(inputFile.getInputStream()); ) {
+        try (PDDocument pdfBoxDoc = Loader.loadPDF(inputFile.getBytes()); ) {
             ObjectMapper objectMapper = new ObjectMapper();
             ObjectNode jsonOutput = objectMapper.createObjectNode();
 
@@ -129,17 +127,6 @@ public class GetInfoOnPDF {
             boolean hasCompression = false;
             String compressionType = "None";
 
-            COSDocument cosDoc = pdfBoxDoc.getDocument();
-            for (COSObject cosObject : cosDoc.getObjects()) {
-                if (cosObject.getObject() instanceof COSStream) {
-                    COSStream cosStream = (COSStream) cosObject.getObject();
-                    if (COSName.OBJ_STM.equals(cosStream.getItem(COSName.TYPE))) {
-                        hasCompression = true;
-                        compressionType = "Object Streams";
-                        break;
-                    }
-                }
-            }
             basicInfo.put("Compression", hasCompression);
             if (hasCompression) basicInfo.put("CompressionType", compressionType);
 
@@ -343,7 +330,6 @@ public class GetInfoOnPDF {
                     permissionsNode.put("CanModify", ap.canModify());
                     permissionsNode.put("CanModifyAnnotations", ap.canModifyAnnotations());
                     permissionsNode.put("CanPrint", ap.canPrint());
-                    permissionsNode.put("CanPrintDegraded", ap.canPrintDegraded());
 
                     encryption.set(
                             "Permissions", permissionsNode); // set the node under "Permissions"
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
index 4c3a95179..8d7c80724 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
@@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.security;
 
 import java.io.IOException;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
 import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
@@ -38,7 +39,7 @@ public class PasswordController {
         MultipartFile fileInput = request.getFileInput();
         String password = request.getPassword();
 
-        PDDocument document = PDDocument.load(fileInput.getBytes(), password);
+        PDDocument document = Loader.loadPDF(fileInput.getBytes(), password);
         document.setAllSecurityToBeRemoved(true);
         return WebResponseUtils.pdfDocToWebResponse(
                 document,
@@ -66,7 +67,7 @@ public class PasswordController {
         boolean canPrint = request.isCanPrint();
         boolean canPrintFaithful = request.isCanPrintFaithful();
 
-        PDDocument document = PDDocument.load(fileInput.getBytes());
+        PDDocument document = Loader.loadPDF(fileInput.getBytes());
         AccessPermission ap = new AccessPermission();
         ap.setCanAssembleDocument(!canAssembleDocument);
         ap.setCanExtractContent(!canExtractContent);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
index 79d15065e..3d4653c59 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
@@ -2,14 +2,15 @@ package stirling.software.SPDF.controller.api.security;
 
 import java.awt.Color;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
 import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
@@ -57,7 +58,7 @@ public class RedactController {
         System.out.println(listOfTextString);
         String[] listOfText = listOfTextString.split("\n");
         byte[] bytes = file.getBytes();
-        PDDocument document = PDDocument.load(new ByteArrayInputStream(bytes));
+        PDDocument document = Loader.loadPDF(bytes);
 
         Color redactColor;
         try {
@@ -86,7 +87,9 @@ public class RedactController {
                 PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight()));
                 imageDocument.addPage(newPage);
                 PDImageXObject pdImage = LosslessFactory.createFromImage(imageDocument, bim);
-                PDPageContentStream contentStream = new PDPageContentStream(imageDocument, newPage);
+                PDPageContentStream contentStream =
+                        new PDPageContentStream(
+                                imageDocument, newPage, AppendMode.APPEND, true, true);
                 contentStream.drawImage(pdImage, 0, 0);
                 contentStream.close();
             }
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
index 30ce14664..8c46e0cfa 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
@@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.security;
 
 import java.io.IOException;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -52,7 +53,7 @@ public class SanitizeController {
         boolean removeLinks = request.isRemoveLinks();
         boolean removeFonts = request.isRemoveFonts();
 
-        try (PDDocument document = PDDocument.load(inputFile.getInputStream())) {
+        try (PDDocument document = Loader.loadPDF(inputFile.getBytes())) {
             if (removeJavaScript) {
                 sanitizeJavaScript(document);
             }
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
index daee68bf6..7bfb4c851 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
@@ -10,12 +10,14 @@ import java.io.InputStream;
 import javax.imageio.ImageIO;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDType0Font;
 import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.apache.pdfbox.pdmodel.font.Standard14Fonts;
 import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
 import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
@@ -58,7 +60,7 @@ public class WatermarkController {
         int heightSpacer = request.getHeightSpacer();
 
         // Load the input PDF
-        PDDocument document = PDDocument.load(pdfFile.getInputStream());
+        PDDocument document = Loader.loadPDF(pdfFile.getBytes());
 
         // Create a page in the document
         for (PDPage page : document.getPages()) {
@@ -66,7 +68,7 @@ public class WatermarkController {
             // Get the page's content stream
             PDPageContentStream contentStream =
                     new PDPageContentStream(
-                            document, page, PDPageContentStream.AppendMode.APPEND, true);
+                            document, page, PDPageContentStream.AppendMode.APPEND, true, true);
 
             // Set transparency
             PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
@@ -117,7 +119,7 @@ public class WatermarkController {
             String alphabet)
             throws IOException {
         String resourceDir = "";
-        PDFont font = PDType1Font.HELVETICA_BOLD;
+        PDFont font = new PDType1Font(Standard14Fonts.FontName.HELVETICA);
         switch (alphabet) {
             case "arabic":
                 resourceDir = "static/fonts/NotoSansArabic-Regular.ttf";
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java
index aa664be08..5465988cf 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java
@@ -3,6 +3,7 @@ package stirling.software.SPDF.model.api;
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 
 import io.swagger.v3.oas.annotations.Hidden;
@@ -27,7 +28,7 @@ public class PDFWithPageNums extends PDFFile {
     public List<Integer> getPageNumbersList() {
         int pageCount = 0;
         try {
-            pageCount = PDDocument.load(getFileInput().getInputStream()).getNumberOfPages();
+            pageCount = Loader.loadPDF(getFileInput().getBytes()).getNumberOfPages();
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java
new file mode 100644
index 000000000..d8cbf7903
--- /dev/null
+++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java
@@ -0,0 +1,16 @@
+package stirling.software.SPDF.model.api.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class UpdateUserDetails extends UpdateUserUsername {
+
+    @Schema(description = "new password for user")
+    private String newPassword;
+}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java
new file mode 100644
index 000000000..8b457605b
--- /dev/null
+++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java
@@ -0,0 +1,16 @@
+package stirling.software.SPDF.model.api.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class UpdateUserUsername extends UsernameAndPass {
+
+    @Schema(description = "new password for user")
+    private String newUsername;
+}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/Username.java b/src/main/java/stirling/software/SPDF/model/api/user/Username.java
new file mode 100644
index 000000000..167df1b1b
--- /dev/null
+++ b/src/main/java/stirling/software/SPDF/model/api/user/Username.java
@@ -0,0 +1,16 @@
+package stirling.software.SPDF.model.api.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Data
+@EqualsAndHashCode
+@NoArgsConstructor
+public class Username {
+
+    @Schema(description = "username of user")
+    private String username;
+}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java
new file mode 100644
index 000000000..d925eef1f
--- /dev/null
+++ b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java
@@ -0,0 +1,16 @@
+package stirling.software.SPDF.model.api.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class UsernameAndPass extends Username {
+
+    @Schema(description = "password of user")
+    private String password;
+}
diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java
index cdf00bf04..672e5c70b 100644
--- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java
+++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java
@@ -19,6 +19,14 @@ import org.springframework.web.multipart.MultipartFile;
 
 public class GeneralUtils {
 
+    public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
+        File tempFile = File.createTempFile("temp", null);
+        try (FileOutputStream os = new FileOutputStream(tempFile)) {
+            os.write(multipartFile.getBytes());
+        }
+        return tempFile;
+    }
+
     public static void deleteDirectory(Path path) throws IOException {
         Files.walkFileTree(
                 path,
diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java
index 79a478646..426fc78d3 100644
--- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java
+++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java
@@ -2,7 +2,6 @@ package stirling.software.SPDF.utils;
 
 import java.awt.Graphics;
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.List;
@@ -16,9 +15,11 @@ import javax.imageio.ImageWriteParam;
 import javax.imageio.ImageWriter;
 import javax.imageio.stream.ImageOutputStream;
 
+import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
 import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
@@ -190,7 +191,7 @@ public class PdfUtils {
             int DPI,
             String filename)
             throws IOException, Exception {
-        try (PDDocument document = PDDocument.load(new ByteArrayInputStream(inputStream))) {
+        try (PDDocument document = Loader.loadPDF(inputStream)) {
             PDFRenderer pdfRenderer = new PDFRenderer(document);
             int pageCount = document.getNumberOfPages();
 
@@ -335,7 +336,8 @@ public class PdfUtils {
         float pageWidth = page.getMediaBox().getWidth();
         float pageHeight = page.getMediaBox().getHeight();
 
-        try (PDPageContentStream contentStream = new PDPageContentStream(doc, page)) {
+        try (PDPageContentStream contentStream =
+                new PDPageContentStream(doc, page, AppendMode.APPEND, true, true)) {
             if ("fillPage".equals(fitOption) || "fitDocumentToImage".equals(fitOption)) {
                 contentStream.drawImage(image, 0, 0, pageWidth, pageHeight);
             } else if ("maintainAspectRatio".equals(fitOption)) {
@@ -368,7 +370,7 @@ public class PdfUtils {
             byte[] pdfBytes, byte[] imageBytes, float x, float y, boolean everyPage)
             throws IOException {
 
-        PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes));
+        PDDocument document = Loader.loadPDF(pdfBytes);
 
         // Get the first page of the PDF
         int pages = document.getNumberOfPages();
@@ -376,7 +378,7 @@ public class PdfUtils {
             PDPage page = document.getPage(i);
             try (PDPageContentStream contentStream =
                     new PDPageContentStream(
-                            document, page, PDPageContentStream.AppendMode.APPEND, true)) {
+                            document, page, PDPageContentStream.AppendMode.APPEND, true, true)) {
                 // Create an image object from the image bytes
                 PDImageXObject image = PDImageXObject.createFromByteArray(document, imageBytes, "");
                 // Draw the image onto the page at the specified x and y coordinates
diff --git a/src/main/resources/templates/change-creds.html b/src/main/resources/templates/change-creds.html
index a954e862d..79d82e049 100644
--- a/src/main/resources/templates/change-creds.html
+++ b/src/main/resources/templates/change-creds.html
@@ -39,12 +39,12 @@
                         <h4 th:text="#{changeCreds.changeUserAndPassword}">Change Username and password</h4>
                         <form action="api/v1/user/change-username-and-password" method="post">
                             <div class="mb-3">
-                                <label for="newUsername" th:text="#{changeCreds.newUsername}">New Username</label>
-                                <input type="text" class="form-control" name="newUsername" id="newUsername" th:placeholder="${username}">
+                                <label for="username" th:text="#{changeCreds.newUsername}">New Username</label>
+                                <input type="text" class="form-control" name="username" id="username" th:placeholder="${username}">
                             </div>
                             <div class="mb-3">
-                                <label for="currentPassword" th:text="#{changeCreds.oldPassword}">Old Password</label>
-                                <input type="password" class="form-control" name="currentPassword" id="currentPasswordPassword"  th:placeholder="#{changeCreds.oldPassword}">
+                                <label for="password" th:text="#{changeCreds.oldPassword}">Old Password</label>
+                                <input type="password" class="form-control" name="password" id="password"  th:placeholder="#{changeCreds.oldPassword}">
                             </div>
                             <div class="mb-3">
                                 <label for="newPassword" th:text="#{changeCreds.newPassword}">New Password</label>