diff --git a/src/videoag_common/database/drift_detector.py b/src/videoag_common/database/drift_detector.py
index 4025e774e65045241cf9781e4fefd2c6559a9461..e04c99adc8b82d3e9dd32ca75e0e5c33c7af773e 100644
--- a/src/videoag_common/database/drift_detector.py
+++ b/src/videoag_common/database/drift_detector.py
@@ -7,6 +7,7 @@ from sqlalchemy import Engine, Table, MetaData, Column, types, DefaultClause, Te
 from sqlalchemy.exc import *
 from sqlalchemy.sql.base import _NoneName, ReadOnlyColumnCollection
 from sqlalchemy.sql.schema import ColumnCollectionConstraint, ForeignKey
+from sqlalchemy.dialects import postgresql as postgresql
 
 
 #
@@ -185,6 +186,16 @@ def _check_types_equal(actual: types.TypeEngine, schema: types.TypeEngine) -> bo
         return (isinstance(actual, types.JSON)
                 and schema.none_as_null == actual.none_as_null)
     
+    if type(schema) is postgresql.JSON:
+        assert isinstance(schema, postgresql.JSON)
+        return (isinstance(actual, postgresql.JSON)
+                and schema.none_as_null == actual.none_as_null)
+    
+    if type(schema) is postgresql.JSONB:
+        assert isinstance(schema, postgresql.JSONB)
+        return (isinstance(actual, postgresql.JSONB)
+                and schema.none_as_null == actual.none_as_null)
+    
     if type(schema) is types.DateTime:
         assert isinstance(schema, types.DateTime)  # For pycharm
         return (isinstance(actual, types.DateTime)
diff --git a/src/videoag_common/objects/course.py b/src/videoag_common/objects/course.py
index 3259cb32597879e1dadc65afd5caf71e3c30bedf..5f08fdefaa59a60ec4dc4055edf3b43cae227e6a 100644
--- a/src/videoag_common/objects/course.py
+++ b/src/videoag_common/objects/course.py
@@ -138,7 +138,7 @@ class Lecture(DeletableApiObject, VisibilityApiObject, ApiViewPermissionsObject,
         )
     )
     media_process: Mapped[dict] = api_mapped(
-        mapped_column(sql.JSON, nullable=True),  # Null indicates, inherit from course
+        mapped_column(postgresql.JSONB, nullable=True),  # Null indicates, inherit from course
         ApiMediaProcessField(
             include_in_config=True
         )
@@ -441,7 +441,7 @@ class Course(DeletableApiObject, VisibilityApiObject, ApiViewPermissionsObject,
         )
     )
     media_process: Mapped[dict] = api_mapped(
-        mapped_column(sql.JSON, nullable=False),
+        mapped_column(postgresql.JSONB, nullable=False),
         ApiMediaProcessField(
             include_in_config=True
         )
diff --git a/src/videoag_common/objects/job.py b/src/videoag_common/objects/job.py
index df45d68ad0e3b415feb22a8998b444f5ca9b2dae..f9a5e178c6a3e98c217dcdb4191c78acc49859c7 100644
--- a/src/videoag_common/objects/job.py
+++ b/src/videoag_common/objects/job.py
@@ -50,13 +50,13 @@ class Job(ApiObject, Base):
         )
     )
     input_data: Mapped[JsonTypes] = api_mapped(
-        mapped_column(sql.JSON, nullable=False),
+        mapped_column(postgresql.JSONB, nullable=False),
         ApiJsonField(
             include_in_data=True
         )
     )
     output_data: Mapped[JsonTypes] = api_mapped(
-        mapped_column(sql.JSON, nullable=True),
+        mapped_column(postgresql.JSONB, nullable=True),
         ApiJsonField(
             include_in_data=True
         )
@@ -69,7 +69,7 @@ class Job(ApiObject, Base):
         )
     )
     on_end_event_data: Mapped[JsonTypes] = api_mapped(
-        mapped_column(sql.JSON, nullable=True),
+        mapped_column(postgresql.JSONB, nullable=True),
         ApiJsonField(
             include_in_data=True
         )
diff --git a/src/videoag_common/objects/medium.py b/src/videoag_common/objects/medium.py
index fdcb44b9b1f80dda89984c0ca27676446f857312..b103c62ce967f385cd7d7118ff7821082514c2ab 100644
--- a/src/videoag_common/objects/medium.py
+++ b/src/videoag_common/objects/medium.py
@@ -108,7 +108,7 @@ class SourceMedium(DeletableApiObject, Base):
     )
     # metadata is reserved
     file_metadata: Mapped[JsonTypes] = api_mapped(
-        mapped_column(sql.JSON, nullable=True),
+        mapped_column(postgresql.JSONB, nullable=True),
         ApiJsonField(
             include_in_data=True,
             # See source file sorter for contents
@@ -340,6 +340,7 @@ class TargetMedium(DeletableApiObject, Base):
 
 class FileMedium(ApiObject):
     file_path: Mapped[str] = mapped_column(String(collation=STRING_COLLATION), nullable=True, use_existing_column=True, index=True)  # TODO move?
+    # TODO size field
     
     @api_include_in_data(
         type_id="string",
@@ -561,7 +562,7 @@ class MediaProcessTemplate(ApiObject, Base):
         )
     )
     process: Mapped[dict] = api_mapped(
-        mapped_column(sql.JSON, nullable=False),
+        mapped_column(postgresql.JSONB, nullable=False),
         ApiMediaProcessField(
             include_in_config=True
         )