diff --git a/api_koreader/models.py b/api_koreader/models.py
index 155f3757d2b604cabd3f27ce11f72e7e1178c62a..8ad3bc5b8ca8a6d0c9e60c71741e8e3e4ffb537d 100644
--- a/api_koreader/models.py
+++ b/api_koreader/models.py
@@ -1,11 +1,14 @@
+import io
+
 from django.db import models
+from django.db.models import QuerySet
 from django.db.models.signals import post_save
 from django.dispatch import receiver
 from django.utils import timezone
 
 from accounts.models import User
 from reader.models import Book, UserBook
-from .xpointer_cfi_utils import epub_kr_to_cfi
+from .xpointer_cfi_utils import epub_kr_to_cfi, epub_cfi_to_kr
 
 
 # Create your models here.
@@ -20,20 +23,35 @@ class SyncDocumentEntry(models.Model):
     created_at = models.DateTimeField(auto_now_add=True, editable=False)
 
 @receiver(post_save, sender=SyncDocumentEntry)
-def post_save_document(sender, instance, **kwargs):
-    book_matches = Book.objects.filter(partial_md5__iexact=instance.key)
+def post_save_document(sender, instance: SyncDocumentEntry, **kwargs):
+    book_matches: QuerySet[Book] = Book.objects.filter(partial_md5__iexact=instance.key)
     if book_matches:
         book = book_matches.first()
-        user_book = UserBook.objects.filter(user_id=instance.user.id, book_id=book.id)
-        if user_book:
+        user_book_qs: QuerySet[UserBook] = UserBook.objects.filter(user_id=instance.user.id, book_id=book.id)
+        if user_book_qs:
             # Get User book
-            user_book = user_book.first()
+            user_book = user_book_qs.first()
             # Detect type of file
-            if book.original_file.name.endswith(".epub"):
-                user_book.last_progress_cfi = epub_kr_to_cfi(user_book.original_file.name, instance.progress)
+            if book.file_type == "epub":
+                user_book.last_progress_cfi = epub_kr_to_cfi(io.BytesIO(book.original_file.open("rb").read()), instance.progress)
             else:
                 user_book.last_progress_cfi = instance.progress
             user_book.percentage_read = instance.percentage
             user_book.last_progress_device = "KoReader - " + instance.device
-            user_book.last_read = timezone.now()
+            user_book.last_read = instance.updated_at
             user_book.save()
+
+@receiver(post_save, sender=UserBook)
+def post_save_userbook(sender, instance: UserBook, **kwargs):
+    # Find the corresponding SyncDocumentEntry
+    sync_doc_q: QuerySet[SyncDocumentEntry] = SyncDocumentEntry.objects.filter(user=instance.user, key__iexact=instance.book.partial_md5)
+    if sync_doc_q.first():
+        sync_doc: SyncDocumentEntry = sync_doc_q.first()
+        if instance.book.file_type == "epub":
+            sync_doc.progress = epub_cfi_to_kr(io.BytesIO(instance.book.original_file.open("rb").read()), instance.last_progress_cfi)
+        else:
+            sync_doc.progress = instance.last_progress_cfi
+        sync_doc.percentage = instance.percentage_read
+        sync_doc.device = instance.last_progress_device
+        sync_doc.updated_at = instance.last_read
+        sync_doc.save()
\ No newline at end of file