diff --git a/frontend.py b/frontend.py
index 454ced6..9126091 100644
--- a/frontend.py
+++ b/frontend.py
@@ -26,7 +26,6 @@
 
 from conf import CONFIG
 from helper import (
-    State,
     admin_required,
     error,
     get_all_live_assets,
@@ -41,6 +40,7 @@
     user_without_limits,
 )
 from ib_hosted import get_scoped_api_key, ib, update_asset_userdata
+from model import State
 from notifier import Notifier
 from redis_session import RedisSessionStore
 
diff --git a/helper.py b/helper.py
index e96d7a5..9f6e084 100644
--- a/helper.py
+++ b/helper.py
@@ -1,17 +1,16 @@
-import enum
 import os
 import random
 import shutil
 import tempfile
 from datetime import datetime
 from functools import wraps
-from typing import NamedTuple, Optional
 
 import requests
 from flask import abort, current_app, g, jsonify, redirect, request, session, url_for
 
 from conf import CONFIG
 from ib_hosted import ib
+from model import State, Asset
 
 
 def error(msg):
@@ -50,57 +49,6 @@ def decorated_function(*args, **kwargs):
     return decorated_function
 
 
-class State(enum.StrEnum):
-    NEW = "new"
-    CONFIRMED = "confirmed"
-    REJECTED = "rejected"
-    DELETED = "deleted"
-    REVIEW = "review"
-
-
-class Asset(NamedTuple):
-    id: str
-    filetype: str
-    thumb: str
-    state: State
-    user: str
-    starts: Optional[int] = None
-    ends: Optional[int] = None
-    moderate_url: Optional[str] = None
-    moderated_by: Optional[str] = None
-
-    def to_dict(self, mod_data=False):
-        return {
-            "id": self.id,
-            "user": self.user,
-            "filetype": self.filetype,
-            "thumb": self.thumb,
-            "url": self.url,
-        } | (
-            {
-                "moderate_url": self.moderate_url,
-                "moderated_by": self.moderated_by,
-                "state": self.state,
-                "starts": self.starts,
-                "ends": self.ends,
-            }
-            if mod_data
-            else {}
-        )
-
-    @property
-    def external_url(self):
-        return url_for("static", filename=cached_asset_name(self), _external=True)
-
-    @property
-    def moderate_url(self):
-        return url_for("content_moderate", asset_id=self.id, _external=True)
-
-    @property
-    def url(self):
-        return url_for("static", filename=cached_asset_name(self))
-
-
 def to_int(num):
     return (
         num
diff --git a/ib_hosted.py b/ib_hosted.py
index 8c9828c..50f4ee6 100644
--- a/ib_hosted.py
+++ b/ib_hosted.py
@@ -4,7 +4,6 @@
 from requests import Session
 
 from conf import CONFIG
-from helper import State
 
 
 class IBHosted:
@@ -66,7 +65,7 @@ def update_asset_userdata(asset, **kw):
         userdata=json_dumps(
             {
                 "user": asset.user,
-                "state": getattr(State, asset.state),
+                "state": sset.state,
                 "starts": asset.starts,
                 "ends": asset.ends,
                 "moderated_by": asset.moderated_by,
diff --git a/model.py b/model.py
new file mode 100644
index 0000000..45e4aec
--- /dev/null
+++ b/model.py
@@ -0,0 +1,53 @@
+import enum
+from typing import NamedTuple, Optional
+
+
+class State(enum.StrEnum):
+    NEW = "new"
+    CONFIRMED = "confirmed"
+    REJECTED = "rejected"
+    DELETED = "deleted"
+    REVIEW = "review"
+
+
+class Asset(NamedTuple):
+    id: str
+    filetype: str
+    thumb: str
+    state: State
+    user: str
+    starts: Optional[int] = None
+    ends: Optional[int] = None
+    moderate_url: Optional[str] = None
+    moderated_by: Optional[str] = None
+
+    def to_dict(self, mod_data=False):
+        return {
+            "id": self.id,
+            "user": self.user,
+            "filetype": self.filetype,
+            "thumb": self.thumb,
+            "url": self.url,
+        } | (
+            {
+                "moderate_url": self.moderate_url,
+                "moderated_by": self.moderated_by,
+                "state": self.state,
+                "starts": self.starts,
+                "ends": self.ends,
+            }
+            if mod_data
+            else {}
+        )
+
+    @property
+    def external_url(self):
+        return url_for("static", filename=cached_asset_name(self), _external=True)
+
+    @property
+    def moderate_url(self):
+        return url_for("content_moderate", asset_id=self.id, _external=True)
+
+    @property
+    def url(self):
+        return url_for("static", filename=cached_asset_name(self))
diff --git a/syncer.py b/syncer.py
index 524e98b..d33601f 100644
--- a/syncer.py
+++ b/syncer.py
@@ -3,8 +3,9 @@
 from logging import getLogger
 
 from conf import CONFIG
-from helper import Asset, State, get_all_live_assets, get_assets, user_is_admin
+from helper import get_all_live_assets, get_assets, user_is_admin
 from ib_hosted import ib
+from model import Asset, State
 from notifier import Notifier
 
 FADE_TIME = 0.5