diff --git a/bookwyrm/models/__init__.py b/bookwyrm/models/__init__.py
index 76290416..48852cfe 100644
--- a/bookwyrm/models/__init__.py
+++ b/bookwyrm/models/__init__.py
@@ -9,8 +9,11 @@ from .connector import Connector
 from .shelf import Shelf, ShelfBook
 
 from .status import Status, GeneratedNote, Review, Comment, Quotation
-from .status import Favorite, Boost, Notification, ReadThrough
+from .status import Boost
 from .attachment import Image
+from .favorite import Favorite
+from .notification import Notification
+from .readthrough import ReadThrough
 
 from .tag import Tag, UserTag
 
diff --git a/bookwyrm/models/favorite.py b/bookwyrm/models/favorite.py
new file mode 100644
index 00000000..8373b016
--- /dev/null
+++ b/bookwyrm/models/favorite.py
@@ -0,0 +1,26 @@
+''' like/fav/star a status '''
+from django.db import models
+from django.utils import timezone
+
+from bookwyrm import activitypub
+from .base_model import ActivitypubMixin, BookWyrmModel
+from . import fields
+
+class Favorite(ActivitypubMixin, BookWyrmModel):
+    ''' fav'ing a post '''
+    user = fields.ForeignKey(
+        'User', on_delete=models.PROTECT, activitypub_field='actor')
+    status = fields.ForeignKey(
+        'Status', on_delete=models.PROTECT, activitypub_field='object')
+
+    activity_serializer = activitypub.Like
+
+    def save(self, *args, **kwargs):
+        ''' update user active time '''
+        self.user.last_active_date = timezone.now()
+        self.user.save()
+        super().save(*args, **kwargs)
+
+    class Meta:
+        ''' can't fav things twice '''
+        unique_together = ('user', 'status')
diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py
new file mode 100644
index 00000000..4ce5dcea
--- /dev/null
+++ b/bookwyrm/models/notification.py
@@ -0,0 +1,33 @@
+''' alert a user to activity '''
+from django.db import models
+from .base_model import BookWyrmModel
+
+
+NotificationType = models.TextChoices(
+    'NotificationType',
+    'FAVORITE REPLY MENTION TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT')
+
+class Notification(BookWyrmModel):
+    ''' you've been tagged, liked, followed, etc '''
+    user = models.ForeignKey('User', on_delete=models.PROTECT)
+    related_book = models.ForeignKey(
+        'Edition', on_delete=models.PROTECT, null=True)
+    related_user = models.ForeignKey(
+        'User',
+        on_delete=models.PROTECT, null=True, related_name='related_user')
+    related_status = models.ForeignKey(
+        'Status', on_delete=models.PROTECT, null=True)
+    related_import = models.ForeignKey(
+        'ImportJob', on_delete=models.PROTECT, null=True)
+    read = models.BooleanField(default=False)
+    notification_type = models.CharField(
+        max_length=255, choices=NotificationType.choices)
+
+    class Meta:
+        ''' checks if notifcation is in enum list for valid types '''
+        constraints = [
+            models.CheckConstraint(
+                check=models.Q(notification_type__in=NotificationType.values),
+                name="notification_type_valid",
+            )
+        ]
diff --git a/bookwyrm/models/readthrough.py b/bookwyrm/models/readthrough.py
new file mode 100644
index 00000000..61cac7e6
--- /dev/null
+++ b/bookwyrm/models/readthrough.py
@@ -0,0 +1,26 @@
+''' progress in a book '''
+from django.db import models
+from django.utils import timezone
+
+from .base_model import BookWyrmModel
+
+
+class ReadThrough(BookWyrmModel):
+    ''' Store progress through a book in the database. '''
+    user = models.ForeignKey('User', on_delete=models.PROTECT)
+    book = models.ForeignKey('Edition', on_delete=models.PROTECT)
+    pages_read = models.IntegerField(
+        null=True,
+        blank=True)
+    start_date = models.DateTimeField(
+        blank=True,
+        null=True)
+    finish_date = models.DateTimeField(
+        blank=True,
+        null=True)
+
+    def save(self, *args, **kwargs):
+        ''' update user active time '''
+        self.user.last_active_date = timezone.now()
+        self.user.save()
+        super().save(*args, **kwargs)
diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py
index 3654e554..10cee752 100644
--- a/bookwyrm/models/status.py
+++ b/bookwyrm/models/status.py
@@ -222,26 +222,6 @@ class Review(Status):
     pure_type = 'Article'
 
 
-class Favorite(ActivitypubMixin, BookWyrmModel):
-    ''' fav'ing a post '''
-    user = fields.ForeignKey(
-        'User', on_delete=models.PROTECT, activitypub_field='actor')
-    status = fields.ForeignKey(
-        'Status', on_delete=models.PROTECT, activitypub_field='object')
-
-    activity_serializer = activitypub.Like
-
-    def save(self, *args, **kwargs):
-        ''' update user active time '''
-        self.user.last_active_date = timezone.now()
-        self.user.save()
-        super().save(*args, **kwargs)
-
-    class Meta:
-        ''' can't fav things twice '''
-        unique_together = ('user', 'status')
-
-
 class Boost(Status):
     ''' boost'ing a post '''
     boosted_status = fields.ForeignKey(
@@ -268,54 +248,3 @@ class Boost(Status):
     # This constraint can't work as it would cross tables.
     # class Meta:
     #     unique_together = ('user', 'boosted_status')
-
-
-class ReadThrough(BookWyrmModel):
-    ''' Store progress through a book in the database. '''
-    user = models.ForeignKey('User', on_delete=models.PROTECT)
-    book = models.ForeignKey('Edition', on_delete=models.PROTECT)
-    pages_read = models.IntegerField(
-        null=True,
-        blank=True)
-    start_date = models.DateTimeField(
-        blank=True,
-        null=True)
-    finish_date = models.DateTimeField(
-        blank=True,
-        null=True)
-
-    def save(self, *args, **kwargs):
-        ''' update user active time '''
-        self.user.last_active_date = timezone.now()
-        self.user.save()
-        super().save(*args, **kwargs)
-
-
-NotificationType = models.TextChoices(
-    'NotificationType',
-    'FAVORITE REPLY MENTION TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT')
-
-class Notification(BookWyrmModel):
-    ''' you've been tagged, liked, followed, etc '''
-    user = models.ForeignKey('User', on_delete=models.PROTECT)
-    related_book = models.ForeignKey(
-        'Edition', on_delete=models.PROTECT, null=True)
-    related_user = models.ForeignKey(
-        'User',
-        on_delete=models.PROTECT, null=True, related_name='related_user')
-    related_status = models.ForeignKey(
-        'Status', on_delete=models.PROTECT, null=True)
-    related_import = models.ForeignKey(
-        'ImportJob', on_delete=models.PROTECT, null=True)
-    read = models.BooleanField(default=False)
-    notification_type = models.CharField(
-        max_length=255, choices=NotificationType.choices)
-
-    class Meta:
-        ''' checks if notifcation is in enum list for valid types '''
-        constraints = [
-            models.CheckConstraint(
-                check=models.Q(notification_type__in=NotificationType.values),
-                name="notification_type_valid",
-            )
-        ]