diff --git a/main.py b/main.py
index 26a26e556d82240eb71b33ef60ccec0b101921dd..66357c213e8c8b6368767a9b7c4e652561113e8b 100644
--- a/main.py
+++ b/main.py
@@ -3,6 +3,7 @@ from orchestrator.cli.main import app as core_cli
 from orchestrator.settings import AppSettings
 
 import products
+import workflows
 
 app = OrchestratorCore(base_settings=AppSettings())
 
diff --git a/migrations/versions/schema/2023-03-13_aa49bed10737_add_create_workflows.py b/migrations/versions/schema/2023-03-13_aa49bed10737_add_create_workflows.py
new file mode 100644
index 0000000000000000000000000000000000000000..99f0af74de388a1e8bddd166617ca18fb3d55edc
--- /dev/null
+++ b/migrations/versions/schema/2023-03-13_aa49bed10737_add_create_workflows.py
@@ -0,0 +1,57 @@
+"""add CREATE workflows.
+
+Revision ID: aa49bed10737
+Revises: 431ca061b2ad
+Create Date: 2023-03-13 11:18:36.787981
+
+"""
+import sqlalchemy as sa
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision = 'aa49bed10737'
+down_revision = '431ca061b2ad'
+branch_labels = None
+depends_on = None
+
+
+from orchestrator.migrations.helpers import create_workflow, delete_workflow
+
+new_workflows = [
+    {
+        "name": "create_trunk",
+        "target": "CREATE",
+        "description": "Create trunk",
+        "product_type": "Trunk"
+    },
+    {
+        "name": "create_trunk_config",
+        "target": "CREATE",
+        "description": "Create trunk config",
+        "product_type": "TrunkConfig"
+    },
+    {
+        "name": "create_trunk_config_common",
+        "target": "CREATE",
+        "description": "Create trunk config common",
+        "product_type": "TrunkConfigCommon"
+    },
+    {
+        "name": "create_trunk_config_side",
+        "target": "CREATE",
+        "description": "Create trunk config side",
+        "product_type": "TrunkConfigSide"
+    }
+]
+
+
+def upgrade() -> None:
+    conn = op.get_bind()
+    for workflow in new_workflows:
+        create_workflow(conn, workflow)
+
+
+def downgrade() -> None:
+    conn = op.get_bind()
+    for workflow in new_workflows:
+        delete_workflow(conn, workflow["name"])
diff --git a/workflows/__init__.py b/workflows/__init__.py
index 9dc5e5f196823138f4415f7c7eeb2b02a51d4017..6eeccd6dbb0490be4e7570b46dd8fa3656f791af 100644
--- a/workflows/__init__.py
+++ b/workflows/__init__.py
@@ -1,6 +1,6 @@
 from orchestrator.workflows import LazyWorkflowInstance
 
 LazyWorkflowInstance("workflows.trunk.create_trunk", "create_trunk")
-LazyWorkflowInstance("workflows.trunk.create_trunk_config", "create_trunk_config")
-LazyWorkflowInstance("workflows.trunk.create_trunk_config_common", "create_trunk_config_common")
-LazyWorkflowInstance("workflows.trunk.create_trunk_config_side", "create_trunk_config_side")
+LazyWorkflowInstance("workflows.trunk_config.create_trunk_config", "create_trunk_config")
+LazyWorkflowInstance("workflows.trunk_config_common.create_trunk_config_common", "create_trunk_config_common")
+LazyWorkflowInstance("workflows.trunk_config_side.create_trunk_config_side", "create_trunk_config_side")
diff --git a/workflows/trunk/create_trunk_config.py b/workflows/trunk_config/create_trunk_config.py
similarity index 93%
rename from workflows/trunk/create_trunk_config.py
rename to workflows/trunk_config/create_trunk_config.py
index 44464dd06db494503ca6d65179887115604ff66f..f2c5c117dbc5128230b5e52e7815f349697abfb4 100644
--- a/workflows/trunk/create_trunk_config.py
+++ b/workflows/trunk_config/create_trunk_config.py
@@ -29,7 +29,7 @@ def trunk_selector() -> list:
         trunk_subscriptions[str(trunk_id)] = trunk_description
 
     return choice_list(
-        Choice("TrunkEnum", zip(trunk_subscriptions.keys(), trunk_subscriptions.items())),
+        Choice("TrunkEnum", zip(trunk_subscriptions.keys(), trunk_subscriptions.items())),  # type:ignore
         min_items=1,
         max_items=1,
     )
@@ -40,7 +40,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
         class Config:
             title = product_name
 
-        trunk_ids: trunk_selector()
+        trunk_ids: trunk_selector()  # type:ignore
 
     user_input = yield CreateTrunkConfigForm
 
@@ -81,7 +81,7 @@ def provision_trunk_config(subscription: TrunkConfigProvisioning) -> State:
     initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
     target=Target.CREATE,
 )
-def create_trunk():
+def create_trunk_config():
 
     return (
         init
diff --git a/workflows/trunk/create_trunk_config_common.py b/workflows/trunk_config_common/create_trunk_config_common.py
similarity index 93%
rename from workflows/trunk/create_trunk_config_common.py
rename to workflows/trunk_config_common/create_trunk_config_common.py
index 875a9f39e6f2ef04bbe4d925c8df79b068a97a6f..3d609ed6c7ca0161db2f7438194ed08f6885a5b6 100644
--- a/workflows/trunk/create_trunk_config_common.py
+++ b/workflows/trunk_config_common/create_trunk_config_common.py
@@ -28,7 +28,7 @@ def trunk_config_selector() -> list:
         trunk_config_subscriptions[str(trunk_config_id)] = trunk_config_description
 
     return choice_list(
-        Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())),
+        Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())),  # type:ignore
         min_items=1,
         max_items=1,
     )
@@ -43,7 +43,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
         is_leased_line: Optional[bool]
         isis_metric: int
         minimum_links: int
-        trunk_config_ids: trunk_config_selector()
+        trunk_config_ids: trunk_config_selector()  # type:ignore
 
     user_input = yield CreateTrunkConfigCommonForm
 
@@ -88,7 +88,7 @@ def provision_trunk_config_common(subscription: TrunkConfigCommonProvisioning) -
     initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
     target=Target.CREATE,
 )
-def create_trunk():
+def create_trunk_config_common():
 
     return (
         init
diff --git a/workflows/trunk/create_trunk_config_side.py b/workflows/trunk_config_side/create_trunk_config_side.py
similarity index 93%
rename from workflows/trunk/create_trunk_config_side.py
rename to workflows/trunk_config_side/create_trunk_config_side.py
index 5b67836f162e95b090169a6e5038cd1e892606b1..67897ea2bdedcbf155d7bc7c3f0e28140175b8ca 100644
--- a/workflows/trunk/create_trunk_config_side.py
+++ b/workflows/trunk_config_side/create_trunk_config_side.py
@@ -28,7 +28,7 @@ def trunk_config_selector() -> list:
         trunk_config_subscriptions[str(trunk_config_id)] = trunk_config_description
 
     return choice_list(
-        Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())),
+        Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())),  # type:ignore
         min_items=1,
         max_items=1,
     )
@@ -45,7 +45,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
         ipv4_address: Optional[str]
         ipv6_address: Optional[str]
         members: Optional[list]
-        trunk_config_ids: trunk_config_selector()
+        trunk_config_ids: trunk_config_selector()  # type:ignore
 
     user_input = yield CreateTrunkConfigSideForm
 
@@ -92,7 +92,7 @@ def provision_trunk_config_side(subscription: TrunkConfigSideProvisioning, fqdn:
     initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
     target=Target.CREATE,
 )
-def create_trunk():
+def create_trunk_config_side():
 
     return (
         init