diff --git a/.gitignore b/.gitignore
index 3fafd07fbe689b9d2fcbdb5ec6e91a4831948f77..99601dda9d9a9ad3916fc9aee7d16d79d83b1082 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 __pycache__
 *.egg-info
+.coverage
+coverage.xml
diff --git a/geant_service_orchestrator/__init__.py b/geant_service_orchestrator/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/geant_service_orchestrator/main.py b/geant_service_orchestrator/main.py
index 66357c213e8c8b6368767a9b7c4e652561113e8b..1df03d52a568865255cc2e141e4b5a0761097b45 100644
--- a/geant_service_orchestrator/main.py
+++ b/geant_service_orchestrator/main.py
@@ -2,8 +2,8 @@ from orchestrator import OrchestratorCore
 from orchestrator.cli.main import app as core_cli
 from orchestrator.settings import AppSettings
 
-import products
-import workflows
+# from geant_service_orchestrator import products
+# from geant_service_orchestrator import workflows
 
 app = OrchestratorCore(base_settings=AppSettings())
 
diff --git a/geant_service_orchestrator/products/__init__.py b/geant_service_orchestrator/products/__init__.py
index 92c8828d399f26b8d54a264d07a642c4565df187..abbeb292f7cc785c0c725ef986ee98a5dc3f3a47 100644
--- a/geant_service_orchestrator/products/__init__.py
+++ b/geant_service_orchestrator/products/__init__.py
@@ -1,9 +1,13 @@
 from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY
 
-from products.product_types.trunk import Trunk
-from products.product_types.trunk_config import TrunkConfig
-from products.product_types.trunk_config_common import TrunkConfigCommon
-from products.product_types.trunk_config_side import TrunkConfigSide
+from geant_service_orchestrator.products.product_types.trunk \
+    import Trunk
+from geant_service_orchestrator.products.product_types.trunk_config \
+    import TrunkConfig
+from geant_service_orchestrator.products.product_types.trunk_config_common \
+    import TrunkConfigCommon
+from geant_service_orchestrator.products.product_types.trunk_config_side \
+    import TrunkConfigSide
 
 SUBSCRIPTION_MODEL_REGISTRY.update(
     {
diff --git a/geant_service_orchestrator/products/product_blocks/trunk.py b/geant_service_orchestrator/products/product_blocks/trunk.py
index 76237c83a0d8e70003e6a301ce566de5c0dfb4f5..bc46bbb7b72a6927246f3f7f3b006d7cd927ac45 100644
--- a/geant_service_orchestrator/products/product_blocks/trunk.py
+++ b/geant_service_orchestrator/products/product_blocks/trunk.py
@@ -4,19 +4,26 @@ from orchestrator.domain.base import ProductBlockModel
 from orchestrator.types import SubscriptionLifecycle
 
 
-class TrunkBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkBlock"):
+class TrunkBlockInactive(
+        ProductBlockModel,
+        lifecycle=[SubscriptionLifecycle.INITIAL],
+        product_block_name="TrunkBlock"):
     trunk_id: Optional[int] = None
     geant_s_sid: Optional[str] = None
     trunk_name: Optional[str] = None
 
 
-class TrunkBlockProvisioning(TrunkBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkBlockProvisioning(
+        TrunkBlockInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk_id: Optional[int] = None
     geant_s_sid: Optional[str] = None
     trunk_name: str
 
 
-class TrunkBlock(TrunkBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class TrunkBlock(
+        TrunkBlockProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk_id: int
     geant_s_sid: str
     trunk_name: str
diff --git a/geant_service_orchestrator/products/product_blocks/trunk_config.py b/geant_service_orchestrator/products/product_blocks/trunk_config.py
index bf375d0cf63c63e24d0aa5d7d1d5582204e9b42c..2c191cfbedcd0b0b60ad15c1f77abb963276a73a 100644
--- a/geant_service_orchestrator/products/product_blocks/trunk_config.py
+++ b/geant_service_orchestrator/products/product_blocks/trunk_config.py
@@ -3,19 +3,27 @@ from typing import Optional
 from orchestrator.domain.base import ProductBlockModel
 from orchestrator.types import SubscriptionLifecycle
 
-from products.product_blocks.trunk import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning
+from geant_service_orchestrator.products.product_blocks.trunk \
+    import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning
 
 
-class TrunkConfigBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkConfigBlock"):
+class TrunkConfigBlockInactive(
+        ProductBlockModel,
+        lifecycle=[SubscriptionLifecycle.INITIAL],
+        product_block_name="TrunkConfigBlock"):
     trunk: TrunkBlockInactive
     trunk_config_id: Optional[int] = None
 
 
-class TrunkConfigBlockProvisioning(TrunkConfigBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkConfigBlockProvisioning(
+        TrunkConfigBlockInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk: TrunkBlockProvisioning
     trunk_config_id: Optional[int] = None
 
 
-class TrunkConfigBlock(TrunkConfigBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class TrunkConfigBlock(
+        TrunkConfigBlockProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk: TrunkBlock
     trunk_config_id: int
diff --git a/geant_service_orchestrator/products/product_blocks/trunk_config_common.py b/geant_service_orchestrator/products/product_blocks/trunk_config_common.py
index c2c18b985bf66078b27b91350e4e586b0a193ed7..c7d3b90993024c176a3678f079c5949398bdeb93 100644
--- a/geant_service_orchestrator/products/product_blocks/trunk_config_common.py
+++ b/geant_service_orchestrator/products/product_blocks/trunk_config_common.py
@@ -3,10 +3,15 @@ from typing import Optional
 from orchestrator.domain.base import ProductBlockModel
 from orchestrator.types import SubscriptionLifecycle
 
-from products.product_blocks.trunk_config import TrunkConfigBlock, TrunkConfigBlockInactive, TrunkConfigBlockProvisioning
+from geant_service_orchestrator.products.product_blocks.trunk_config \
+    import TrunkConfigBlock, TrunkConfigBlockInactive, \
+    TrunkConfigBlockProvisioning
 
 
-class TrunkConfigCommonBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkConfigCommonBlock"):
+class TrunkConfigCommonBlockInactive(
+        ProductBlockModel,
+        lifecycle=[SubscriptionLifecycle.INITIAL],
+        product_block_name="TrunkConfigCommonBlock"):
     trunk_config: TrunkConfigBlockInactive
     trunk_config_common_id: Optional[int] = None
     speed: Optional[str] = None
@@ -15,7 +20,9 @@ class TrunkConfigCommonBlockInactive(ProductBlockModel, lifecycle=[SubscriptionL
     minimum_links: Optional[int] = None
 
 
-class TrunkConfigCommonBlockProvisioning(TrunkConfigCommonBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkConfigCommonBlockProvisioning(
+        TrunkConfigCommonBlockInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk_config: TrunkConfigBlockProvisioning
     trunk_config_common_id: Optional[int] = None
     speed: str
@@ -24,7 +31,9 @@ class TrunkConfigCommonBlockProvisioning(TrunkConfigCommonBlockInactive, lifecyc
     minimum_links: int
 
 
-class TrunkConfigCommonBlock(TrunkConfigCommonBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class TrunkConfigCommonBlock(
+        TrunkConfigCommonBlockProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk_config: TrunkConfigBlock
     trunk_config_common_id: int
     speed: str
diff --git a/geant_service_orchestrator/products/product_blocks/trunk_config_side.py b/geant_service_orchestrator/products/product_blocks/trunk_config_side.py
index 8bf1b039a315a6ef254ef33367e6965526c8dbb3..e78d198b94dd9b1befef5db98dc2d9bb5358cda6 100644
--- a/geant_service_orchestrator/products/product_blocks/trunk_config_side.py
+++ b/geant_service_orchestrator/products/product_blocks/trunk_config_side.py
@@ -3,10 +3,15 @@ from typing import Optional
 from orchestrator.domain.base import ProductBlockModel
 from orchestrator.types import SubscriptionLifecycle
 
-from products.product_blocks.trunk_config import TrunkConfigBlock, TrunkConfigBlockInactive, TrunkConfigBlockProvisioning
+from geant_service_orchestrator.products.product_blocks.trunk_config \
+    import TrunkConfigBlock, TrunkConfigBlockInactive,\
+    TrunkConfigBlockProvisioning
 
 
-class TrunkConfigSideBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkConfigSideBlock"):
+class TrunkConfigSideBlockInactive(
+        ProductBlockModel,
+        lifecycle=[SubscriptionLifecycle.INITIAL],
+        product_block_name="TrunkConfigSideBlock"):
     trunk_config: TrunkConfigBlockInactive
     trunk_config_side_id: Optional[int] = None
     fqdn: Optional[str] = None
@@ -17,7 +22,9 @@ class TrunkConfigSideBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLif
     members: Optional[list] = None
 
 
-class TrunkConfigSideBlockProvisioning(TrunkConfigSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkConfigSideBlockProvisioning(
+        TrunkConfigSideBlockInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk_config: TrunkConfigBlockProvisioning
     trunk_config_side_id: Optional[int] = None
     fqdn: str
@@ -28,7 +35,9 @@ class TrunkConfigSideBlockProvisioning(TrunkConfigSideBlockInactive, lifecycle=[
     members: Optional[list] = None
 
 
-class TrunkConfigSideBlock(TrunkConfigSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class TrunkConfigSideBlock(
+        TrunkConfigSideBlockProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk_config: TrunkConfigBlock
     trunk_config_side_id: int
     fqdn: str
diff --git a/geant_service_orchestrator/products/product_types/trunk.py b/geant_service_orchestrator/products/product_types/trunk.py
index 5b000584ee2c84b90a7f37024f6ec0c71dc4b272..de30a39862f8225b7511ca4a5673f24508945ac8 100644
--- a/geant_service_orchestrator/products/product_types/trunk.py
+++ b/geant_service_orchestrator/products/product_types/trunk.py
@@ -1,16 +1,23 @@
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
-from products.product_blocks.trunk import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning
+from geant_service_orchestrator.products.product_blocks.trunk \
+    import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning
 
 
-class TrunkInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]):
+class TrunkInactive(
+        SubscriptionModel, is_base=True,
+        lifecycle=[SubscriptionLifecycle.INITIAL]):
     trunk: TrunkBlockInactive
 
 
-class TrunkProvisioning(TrunkInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkProvisioning(
+        TrunkInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk: TrunkBlockProvisioning
 
 
-class Trunk(TrunkProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class Trunk(
+        TrunkProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk: TrunkBlock
diff --git a/geant_service_orchestrator/products/product_types/trunk_config.py b/geant_service_orchestrator/products/product_types/trunk_config.py
index 94e48c32a97196db93e05b4e9e4ee82661a3fb43..6e33bebaa22fc508441365bbe91b12d168eee083 100644
--- a/geant_service_orchestrator/products/product_types/trunk_config.py
+++ b/geant_service_orchestrator/products/product_types/trunk_config.py
@@ -1,16 +1,24 @@
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
-from products.product_blocks.trunk_config import TrunkConfigBlock, TrunkConfigBlockInactive, TrunkConfigBlockProvisioning
+from geant_service_orchestrator.products.product_blocks.trunk_config \
+    import TrunkConfigBlock, TrunkConfigBlockInactive,\
+    TrunkConfigBlockProvisioning
 
 
-class TrunkConfigInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]):
+class TrunkConfigInactive(
+        SubscriptionModel,
+        is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]):
     trunk_config: TrunkConfigBlockInactive
 
 
-class TrunkConfigProvisioning(TrunkConfigInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkConfigProvisioning(
+        TrunkConfigInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk_config: TrunkConfigBlockProvisioning
 
 
-class TrunkConfig(TrunkConfigProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class TrunkConfig(
+        TrunkConfigProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk_config: TrunkConfigBlock
diff --git a/geant_service_orchestrator/products/product_types/trunk_config_common.py b/geant_service_orchestrator/products/product_types/trunk_config_common.py
index 06999907ebd9a776869a751bdd6d67785da69e61..6d1d9480bdaaebbe3299acd7149bf71348638e8a 100644
--- a/geant_service_orchestrator/products/product_types/trunk_config_common.py
+++ b/geant_service_orchestrator/products/product_types/trunk_config_common.py
@@ -1,16 +1,25 @@
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
-from products.product_blocks.trunk_config_common import TrunkConfigCommonBlock, TrunkConfigCommonBlockInactive, TrunkConfigCommonBlockProvisioning
+from geant_service_orchestrator.products.product_blocks.trunk_config_common \
+    import TrunkConfigCommonBlock, TrunkConfigCommonBlockInactive, \
+    TrunkConfigCommonBlockProvisioning
 
 
-class TrunkConfigCommonInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]):
+class TrunkConfigCommonInactive(
+        SubscriptionModel,
+        is_base=True,
+        lifecycle=[SubscriptionLifecycle.INITIAL]):
     trunk_config_common: TrunkConfigCommonBlockInactive
 
 
-class TrunkConfigCommonProvisioning(TrunkConfigCommonInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkConfigCommonProvisioning(
+        TrunkConfigCommonInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk_config_common: TrunkConfigCommonBlockProvisioning
 
 
-class TrunkConfigCommon(TrunkConfigCommonProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class TrunkConfigCommon(
+        TrunkConfigCommonProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk_config_common: TrunkConfigCommonBlock
diff --git a/geant_service_orchestrator/products/product_types/trunk_config_side.py b/geant_service_orchestrator/products/product_types/trunk_config_side.py
index c0600fab107f37dc42e57263a7db20e7cdfbd34b..943dfc35dc72d12ca1dab96b719779bf896e2ec3 100644
--- a/geant_service_orchestrator/products/product_types/trunk_config_side.py
+++ b/geant_service_orchestrator/products/product_types/trunk_config_side.py
@@ -1,16 +1,25 @@
 from orchestrator.domain.base import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle
 
-from products.product_blocks.trunk_config_side import TrunkConfigSideBlock, TrunkConfigSideBlockInactive, TrunkConfigSideBlockProvisioning
+from geant_service_orchestrator.products.product_blocks.trunk_config_side \
+    import TrunkConfigSideBlock, TrunkConfigSideBlockInactive, \
+    TrunkConfigSideBlockProvisioning
 
 
-class TrunkConfigSideInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]):
+class TrunkConfigSideInactive(
+        SubscriptionModel,
+        is_base=True,
+        lifecycle=[SubscriptionLifecycle.INITIAL]):
     trunk_config_side: TrunkConfigSideBlockInactive
 
 
-class TrunkConfigSideProvisioning(TrunkConfigSideInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+class TrunkConfigSideProvisioning(
+        TrunkConfigSideInactive,
+        lifecycle=[SubscriptionLifecycle.PROVISIONING]):
     trunk_config_side: TrunkConfigSideBlockProvisioning
 
 
-class TrunkConfigSide(TrunkConfigSideProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+class TrunkConfigSide(
+        TrunkConfigSideProvisioning,
+        lifecycle=[SubscriptionLifecycle.ACTIVE]):
     trunk_config_side: TrunkConfigSideBlock
diff --git a/geant_service_orchestrator/workflows/__init__.py b/geant_service_orchestrator/workflows/__init__.py
index 3a379cd401c3d7d0346f69e91f047b48886fe54a..282c688fb2ab365abab14b9a3774b525614044af 100644
--- a/geant_service_orchestrator/workflows/__init__.py
+++ b/geant_service_orchestrator/workflows/__init__.py
@@ -1,10 +1,26 @@
 from orchestrator.workflows import LazyWorkflowInstance
 
-LazyWorkflowInstance("workflows.trunk.create_trunk", "create_trunk")
-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")
-LazyWorkflowInstance("workflows.trunk.terminate_trunk", "terminate_trunk")
-LazyWorkflowInstance("workflows.trunk_config.terminate_trunk_config", "terminate_trunk_config")
-LazyWorkflowInstance("workflows.trunk_config_common.terminate_trunk_config_common", "terminate_trunk_config_common")
-LazyWorkflowInstance("workflows.trunk_config_side.terminate_trunk_config_side", "terminate_trunk_config_side")
+LazyWorkflowInstance(
+    "workflows.trunk.create_trunk",
+    "create_trunk")
+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")
+LazyWorkflowInstance(
+    "workflows.trunk.terminate_trunk",
+    "terminate_trunk")
+LazyWorkflowInstance(
+    "workflows.trunk_config.terminate_trunk_config",
+    "terminate_trunk_config")
+LazyWorkflowInstance(
+    "workflows.trunk_config_common.terminate_trunk_config_common",
+    "terminate_trunk_config_common")
+LazyWorkflowInstance(
+    "workflows.trunk_config_side.terminate_trunk_config_side",
+    "terminate_trunk_config_side")
diff --git a/geant_service_orchestrator/workflows/trunk/create_trunk.py b/geant_service_orchestrator/workflows/trunk/create_trunk.py
index f994aff805ec02c799ff96bdade5a27cda4b5ada..518efd920423025aed4d49deb4f38a133eb2048d 100644
--- a/geant_service_orchestrator/workflows/trunk/create_trunk.py
+++ b/geant_service_orchestrator/workflows/trunk/create_trunk.py
@@ -3,12 +3,15 @@ from uuid import uuid4
 
 from orchestrator.forms import FormPage
 from orchestrator.targets import Target
-from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
+from orchestrator.types \
+    import FormGenerator, State, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription
 from orchestrator.workflows.utils import wrap_create_initial_input_form
 
-from products.product_types.trunk import TrunkInactive, TrunkProvisioning
+from geant_service_orchestrator.products.product_types.trunk \
+    import TrunkInactive, TrunkProvisioning
 
 
 def initial_input_form_generator(product_name: str) -> FormGenerator:
@@ -33,21 +36,30 @@ def _provision_in_gap(trunk_name: str) -> int:
 def create_subscription(product: UUIDstr) -> State:
     subscription = TrunkInactive.from_product_id(product, uuid4())
 
-    return {"subscription": subscription, "subscription_id": subscription.subscription_id}
+    return {
+        "subscription": subscription,
+        "subscription_id": subscription.subscription_id
+    }
 
 
 @step("Initialize subscription")
-def initialize_subscription(subscription: TrunkInactive, trunk_name: str, geant_s_sid: str) -> State:
+def initialize_subscription(
+        subscription: TrunkInactive,
+        trunk_name: str,
+        geant_s_sid: str) -> State:
     subscription.trunk.trunk_name = trunk_name
     subscription.trunk.geant_s_sid = geant_s_sid
     subscription.description = f"Trunk {trunk_name}"
-    subscription = TrunkProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)
+    subscription = TrunkProvisioning.from_other_lifecycle(
+        subscription, SubscriptionLifecycle.PROVISIONING)
 
     return {"subscription": subscription}
 
 
 @step("Provision trunk")
-def provision_trunk(subscription: TrunkProvisioning, trunk_name: str) -> State:
+def provision_trunk(
+        subscription: TrunkProvisioning,
+        trunk_name: str) -> State:
     trunk_id = _provision_in_gap(trunk_name)
     subscription.trunk.trunk_id = trunk_id
 
@@ -56,7 +68,7 @@ def provision_trunk(subscription: TrunkProvisioning, trunk_name: str) -> State:
 
 @workflow(
     "Create trunk",
-    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.CREATE,
 )
 def create_trunk():
diff --git a/geant_service_orchestrator/workflows/trunk/terminate_trunk.py b/geant_service_orchestrator/workflows/trunk/terminate_trunk.py
index cfb0e43147b3c2f1210342d670605fe656a62bfe..28277aa42a387a92d1bcaa7b19401f8aecba59be 100644
--- a/geant_service_orchestrator/workflows/trunk/terminate_trunk.py
+++ b/geant_service_orchestrator/workflows/trunk/terminate_trunk.py
@@ -3,17 +3,21 @@ from orchestrator.forms.validators import Label
 from orchestrator.targets import Target
 from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription, unsync
 from orchestrator.workflows.utils import wrap_modify_initial_input_form
 
-from products import Trunk
+from geant_service_orchestrator.products import Trunk
 
 
-def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm:
+def initial_input_form_generator(
+        subscription_id: UUIDstr,
+        organisation: UUIDstr) -> InputForm:
     subscription = Trunk.from_subscription(subscription_id)
 
     class TerminateForm(FormPage):
-        are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?"  # type:ignore
+        are_you_sure: Label = 'Are you sure you want to remove ' \
+                              f'{subscription.description}?'  # type:ignore
 
     return TerminateForm
 
@@ -29,7 +33,7 @@ def deprovision_trunk(subscription: Trunk) -> None:
 
 @workflow(
     "Terminate trunk",
-    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.TERMINATE,
 )
 def terminate_trunk():
@@ -42,4 +46,4 @@ def terminate_trunk():
         >> set_status(SubscriptionLifecycle.TERMINATED)
         >> resync
         >> done
-    )
\ No newline at end of file
+    )
diff --git a/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py b/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py
index 6338f7704d0915ce54d3ca54c67e80f2c3beabbc..4dafee56cbca9aa1000d5d5bb6270ebe94c0fb31 100644
--- a/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py
+++ b/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py
@@ -1,18 +1,22 @@
-from typing import List, Optional
+import random
+from typing import List
 from uuid import uuid4
-from random import randint
 
 from orchestrator.db.models import ProductTable, SubscriptionTable
 from orchestrator.forms import FormPage
 from orchestrator.forms.validators import Choice, choice_list
 from orchestrator.targets import Target
-from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
+from orchestrator.types \
+    import FormGenerator, State, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription
 from orchestrator.workflows.utils import wrap_create_initial_input_form
 
-from products.product_types.trunk_config import TrunkConfigInactive, TrunkConfigProvisioning
-from products.product_types.trunk import Trunk
+from geant_service_orchestrator.products.product_types.trunk_config \
+    import TrunkConfigInactive, TrunkConfigProvisioning
+from geant_service_orchestrator.products.product_types.trunk \
+    import Trunk
 
 
 def trunk_selector() -> list:
@@ -23,13 +27,17 @@ def trunk_selector() -> list:
             ProductTable.product_type == "Trunk",
             SubscriptionTable.status == "active",
         )
-        .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description)
+        .with_entities(
+            SubscriptionTable.subscription_id,
+            SubscriptionTable.description)
         .all()
     ):
         trunk_subscriptions[str(trunk_id)] = trunk_description
 
     return choice_list(
-        Choice("TrunkEnum", zip(trunk_subscriptions.keys(), trunk_subscriptions.items())),  # type:ignore
+        Choice("TrunkEnum", zip(
+            trunk_subscriptions.keys(),
+            trunk_subscriptions.items())),  # type:ignore
         min_items=1,
         max_items=1,
     )
@@ -56,20 +64,30 @@ def _provision_in_gap() -> int:
 def create_subscription(product: UUIDstr) -> State:
     subscription = TrunkConfigInactive.from_product_id(product, uuid4())
 
-    return {"subscription": subscription, "subscription_id": subscription.subscription_id}
+    return {
+        "subscription": subscription,
+        "subscription_id": subscription.subscription_id
+    }
 
 
 @step("Initialize subscription")
-def initialize_subscription(subscription: TrunkConfigInactive, trunk_ids: List[str]) -> State:
-    subscription.trunk_config.trunk = Trunk.from_subscription(trunk_ids[0]).trunk
-    subscription.description = f"TrunkConfig from Trunk {subscription.trunk_config.trunk.trunk_name}"
-    subscription = TrunkConfigProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)
+def initialize_subscription(
+        subscription: TrunkConfigInactive,
+        trunk_ids: List[str]) -> State:
+    subscription.trunk_config.trunk \
+        = Trunk.from_subscription(trunk_ids[0]).trunk
+    subscription.description =\
+        "TrunkConfig from Trunk " \
+        f"{subscription.trunk_config.trunk.trunk_name}"
+    subscription = TrunkConfigProvisioning.from_other_lifecycle(
+        subscription, SubscriptionLifecycle.PROVISIONING)
 
     return {"subscription": subscription}
 
 
 @step("Provision trunk config")
-def provision_trunk_config(subscription: TrunkConfigProvisioning) -> State:
+def provision_trunk_config(
+        subscription: TrunkConfigProvisioning) -> State:
     trunk_config_id = _provision_in_gap()
     subscription.trunk_config.trunk_config_id = trunk_config_id
 
@@ -78,7 +96,7 @@ def provision_trunk_config(subscription: TrunkConfigProvisioning) -> State:
 
 @workflow(
     "Create trunk config",
-    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.CREATE,
 )
 def create_trunk_config():
diff --git a/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py b/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py
index 2d4d6cb689da21992218dcf41693734fb6f987a4..9671b56352debc4e822a119f334fea407b8d52dc 100644
--- a/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py
+++ b/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py
@@ -3,17 +3,22 @@ from orchestrator.forms.validators import Label
 from orchestrator.targets import Target
 from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription, unsync
 from orchestrator.workflows.utils import wrap_modify_initial_input_form
 
 from products import TrunkConfig
 
 
-def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm:
+def initial_input_form_generator(
+        subscription_id: UUIDstr,
+        organisation: UUIDstr) -> InputForm:
     subscription = TrunkConfig.from_subscription(subscription_id)
 
     class TerminateForm(FormPage):
-        are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?"  # type:ignore
+        are_you_sure: Label = \
+            "Are you sure you want to remove " \
+            f"{subscription.description}?"  # type:ignore
 
     return TerminateForm
 
@@ -29,7 +34,7 @@ def deprovision_trunk_config(subscription: TrunkConfig) -> None:
 
 @workflow(
     "Terminate trunk config",
-    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.TERMINATE,
 )
 def terminate_trunk_config():
@@ -42,4 +47,4 @@ def terminate_trunk_config():
         >> set_status(SubscriptionLifecycle.TERMINATED)
         >> resync
         >> done
-    )
\ No newline at end of file
+    )
diff --git a/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py b/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py
index 0673d2f7349b2747702d4be007e82dc676e0dc3a..77640c4e7a6cc3d5657df749373a0c117cc8c9e1 100644
--- a/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py
+++ b/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py
@@ -1,3 +1,4 @@
+import random
 from typing import List, Optional
 from uuid import uuid4
 
@@ -5,13 +6,17 @@ from orchestrator.db.models import ProductTable, SubscriptionTable
 from orchestrator.forms import FormPage
 from orchestrator.forms.validators import Choice, choice_list
 from orchestrator.targets import Target
-from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
+from orchestrator.types \
+    import FormGenerator, State, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription
 from orchestrator.workflows.utils import wrap_create_initial_input_form
 
-from products.product_types.trunk_config_common import TrunkConfigCommonInactive, TrunkConfigCommonProvisioning
-from products.product_types.trunk_config import TrunkConfig
+from geant_service_orchestrator.products.product_types.trunk_config_common \
+    import TrunkConfigCommonInactive, TrunkConfigCommonProvisioning
+from geant_service_orchestrator.products.product_types.trunk_config \
+    import TrunkConfig
 
 
 def trunk_config_selector() -> list:
@@ -22,13 +27,18 @@ def trunk_config_selector() -> list:
             ProductTable.product_type == "TrunkConfig",
             SubscriptionTable.status == "active",
         )
-        .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description)
+        .with_entities(
+            SubscriptionTable.subscription_id,
+            SubscriptionTable.description)
         .all()
     ):
-        trunk_config_subscriptions[str(trunk_config_id)] = trunk_config_description
+        trunk_config_subscriptions[
+            str(trunk_config_id)] = trunk_config_description
 
     return choice_list(
-        Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())),  # type:ignore
+        Choice("TrunkConfigEnum", zip(
+            trunk_config_subscriptions.keys(),
+            trunk_config_subscriptions.items())),  # type:ignore
         min_items=1,
         max_items=1,
     )
@@ -38,15 +48,13 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
     class CreateTrunkConfigForm(FormPage):
         class Config:
             title = product_name
-
         speed: str
         is_leased_line: Optional[bool]
         isis_metric: int
         minimum_links: int
         trunk_config_ids: trunk_config_selector()  # type:ignore
 
-    user_input = yield CreateTrunkConfigCommonForm
-
+    user_input = yield CreateTrunkConfigForm
     return user_input.dict()
 
 
@@ -57,35 +65,52 @@ def _provision_in_gap() -> int:
 
 @step("Create subscription")
 def create_subscription(product: UUIDstr) -> State:
-    subscription = TrunkConfigCommonInactive.from_product_id(product, uuid4())
+    subscription \
+        = TrunkConfigCommonInactive.from_product_id(product, uuid4())
 
-    return {"subscription": subscription, "subscription_id": subscription.subscription_id}
+    return {
+        "subscription": subscription,
+        "subscription_id": subscription.subscription_id
+    }
 
 
 @step("Initialize subscription")
-def initialize_subscription(subscription: TrunkConfigCommonInactive, speed: str, is_leased_line: bool, isis_metric: int, minimum_links: int, trunk_config_ids: List[str]) -> State:
+def initialize_subscription(
+        subscription: TrunkConfigCommonInactive,
+        speed: str,
+        is_leased_line: bool,
+        isis_metric: int,
+        minimum_links: int,
+        trunk_config_ids: List[str]) -> State:
     subscription.trunk_config_common.speed = speed
     subscription.trunk_config_common.is_leased_line = is_leased_line
     subscription.trunk_config_common.isis_metric = isis_metric
     subscription.trunk_config_common.minimum_links = minimum_links
-    subscription.trunk_config_common.trunk_config = TrunkConfig.from_subscription(trunk_config_ids[0]).trunk_config
-    subscription.description = f"TrunkConfigCommon from TrunkConfig {subscription.trunk_config_common.trunk_config.trunk_config_id}"
-    subscription = TrunkConfigCommonProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)
+    subscription.trunk_config_common.trunk_config \
+        = TrunkConfig.from_subscription(
+            trunk_config_ids[0]).trunk_config
+    subscription.description = \
+        "TrunkConfigCommon from TrunkConfig " \
+        f"{subscription.trunk_config_common.trunk_config.trunk_config_id}"
+    subscription = TrunkConfigCommonProvisioning.from_other_lifecycle(
+        subscription, SubscriptionLifecycle.PROVISIONING)
 
     return {"subscription": subscription}
 
 
 @step("Provision trunk config common")
-def provision_trunk_config_common(subscription: TrunkConfigCommonProvisioning) -> State:
+def provision_trunk_config_common(
+        subscription: TrunkConfigCommonProvisioning) -> State:
     trunk_config_common_id = _provision_in_gap()
-    subscription.trunk_config_common.trunk_config_common_id = trunk_config_common_id
+    subscription.trunk_config_common.trunk_config_common_id \
+        = trunk_config_common_id
 
     return {"subscription": subscription}
 
 
 @workflow(
     "Create trunk config common",
-    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.CREATE,
 )
 def create_trunk_config_common():
diff --git a/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py b/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py
index b92da2476a7da36556c9334c9c3671bf49bb996d..976fe5925f3354539813126bb1487f22a0a51f9d 100644
--- a/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py
+++ b/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py
@@ -3,17 +3,22 @@ from orchestrator.forms.validators import Label
 from orchestrator.targets import Target
 from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription, unsync
 from orchestrator.workflows.utils import wrap_modify_initial_input_form
 
-from products import TrunkConfigCommon
+from geant_service_orchestrator.products import TrunkConfigCommon
 
 
-def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm:
+def initial_input_form_generator(
+        subscription_id: UUIDstr,
+        organisation: UUIDstr) -> InputForm:
     subscription = TrunkConfigCommon.from_subscription(subscription_id)
 
     class TerminateForm(FormPage):
-        are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?"  # type:ignore
+        are_you_sure: Label = \
+            "Are you sure you want to remove " \
+            f"{subscription.description}?"  # type:ignore
 
     return TerminateForm
 
@@ -23,13 +28,15 @@ def _deprovision_in_gap(trunk_config_common_id: int) -> int:
 
 
 @step("Deprovision trunk config common")
-def deprovision_trunk_config_common(subscription: TrunkConfigCommon) -> None:
-    _deprovision_in_gap(subscription.trunk_config_common.trunk_config_common_id)
+def deprovision_trunk_config_common(
+        subscription: TrunkConfigCommon) -> None:
+    _deprovision_in_gap(
+        subscription.trunk_config_common.trunk_config_common_id)
 
 
 @workflow(
     "Terminate trunk config common",
-    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.TERMINATE,
 )
 def terminate_trunk_config_common():
@@ -42,4 +49,4 @@ def terminate_trunk_config_common():
         >> set_status(SubscriptionLifecycle.TERMINATED)
         >> resync
         >> done
-    )
\ No newline at end of file
+    )
diff --git a/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py b/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py
index d5da830d977ebaf50f9ed614ec6c0142d565f52f..19b50f8c9936c08034ef5d31cda62fcc3b359516 100644
--- a/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py
+++ b/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py
@@ -5,13 +5,17 @@ from orchestrator.db.models import ProductTable, SubscriptionTable
 from orchestrator.forms import FormPage
 from orchestrator.forms.validators import Choice, choice_list
 from orchestrator.targets import Target
-from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
+from orchestrator.types \
+    import FormGenerator, State, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription
 from orchestrator.workflows.utils import wrap_create_initial_input_form
 
-from products.product_types.trunk_config_side import TrunkConfigSideInactive, TrunkConfigSideProvisioning
-from products.product_types.trunk_config import TrunkConfig
+from geant_service_orchestrator.products.product_types.trunk_config_side \
+    import TrunkConfigSideInactive, TrunkConfigSideProvisioning
+from geant_service_orchestrator.products.product_types.trunk_config \
+    import TrunkConfig
 
 
 def trunk_config_selector() -> list:
@@ -22,20 +26,25 @@ def trunk_config_selector() -> list:
             ProductTable.product_type == "TrunkConfig",
             SubscriptionTable.status == "active",
         )
-        .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description)
+        .with_entities(
+            SubscriptionTable.subscription_id,
+            SubscriptionTable.description)
         .all()
     ):
-        trunk_config_subscriptions[str(trunk_config_id)] = trunk_config_description
+        trunk_config_subscriptions[
+            str(trunk_config_id)] = trunk_config_description
 
     return choice_list(
-        Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())),  # type:ignore
+        Choice("TrunkConfigEnum", zip(
+            trunk_config_subscriptions.keys(),
+            trunk_config_subscriptions.items())),  # type:ignore
         min_items=1,
         max_items=1,
     )
 
 
 def initial_input_form_generator(product_name: str) -> FormGenerator:
-    class CreateTrunkConfigForm(FormPage):
+    class CreateTrunkConfigCommonForm(FormPage):
         class Config:
             title = product_name
 
@@ -47,40 +56,56 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
         members: Optional[list]
         trunk_config_ids: trunk_config_selector()  # type:ignore
 
-    user_input = yield CreateTrunkConfigSideForm
+    user_input = yield CreateTrunkConfigCommonForm
 
     return user_input.dict()
 
 
 def _provision_in_gap(fqdn: str) -> int:
-
     return abs(hash(fqdn))
 
 
 @step("Create subscription")
 def create_subscription(product: UUIDstr) -> State:
-    subscription = TrunkConfigSideInactive.from_product_id(product, uuid4())
+    subscription \
+        = TrunkConfigSideInactive.from_product_id(product, uuid4())
 
-    return {"subscription": subscription, "subscription_id": subscription.subscription_id}
+    return {
+        "subscription": subscription,
+        "subscription_id": subscription.subscription_id
+    }
 
 
 @step("Initialize subscription")
-def initialize_subscription(subscription: TrunkConfigSideInactive, fqdn: str, ae_name: str, geant_a_sid: str, ipv4_address: str, ipv6_address: str, members: list, trunk_config_ids: List[str]) -> State:
+def initialize_subscription(
+        subscription: TrunkConfigSideInactive,
+        fqdn: str,
+        ae_name: str,
+        geant_a_sid: str,
+        ipv4_address: str,
+        ipv6_address: str,
+        members: list,
+        trunk_config_ids: List[str]) -> State:
     subscription.trunk_config_side.fqdn = fqdn
     subscription.trunk_config_side.ae_name = ae_name
     subscription.trunk_config_side.geant_a_sid = geant_a_sid
     subscription.trunk_config_side.ipv4_address = ipv4_address
     subscription.trunk_config_side.ipv6_address = ipv6_address
     subscription.trunk_config_side.members = members
-    subscription.trunk_config_side.trunk_config = TrunkConfig.from_subscription(trunk_config_ids[0]).trunk_config
-    subscription.description = f"TrunkConfigSide from TrunkConfig {subscription.trunk_config_side.trunk_config.trunk_config_id}"
-    subscription = TrunkConfigSideProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)
+    subscription.trunk_config_side.trunk_config \
+        = TrunkConfig.from_subscription(trunk_config_ids[0]).trunk_config
+    subscription.description = \
+        "TrunkConfigSide from TrunkConfig " \
+        f"{subscription.trunk_config_side.trunk_config.trunk_config_id}"
+    subscription = TrunkConfigSideProvisioning.from_other_lifecycle(
+        subscription, SubscriptionLifecycle.PROVISIONING)
 
     return {"subscription": subscription}
 
 
 @step("Provision trunk config side")
-def provision_trunk_config_side(subscription: TrunkConfigSideProvisioning, fqdn: str) -> State:
+def provision_trunk_config_side(
+        subscription: TrunkConfigSideProvisioning, fqdn: str) -> State:
     trunk_config_side_id = _provision_in_gap(fqdn)
     subscription.trunk_config_side.trunk_config_side_id = trunk_config_side_id
 
@@ -89,7 +114,7 @@ def provision_trunk_config_side(subscription: TrunkConfigSideProvisioning, fqdn:
 
 @workflow(
     "Create trunk config side",
-    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.CREATE,
 )
 def create_trunk_config_side():
diff --git a/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py b/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py
index a9a29e1f420c73e93392576bc6ba43e3caf2e5db..bed443092e2601c74163393458ce8e52c060dc26 100644
--- a/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py
+++ b/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py
@@ -3,17 +3,22 @@ from orchestrator.forms.validators import Label
 from orchestrator.targets import Target
 from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr
 from orchestrator.workflow import done, init, step, workflow
-from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync
+from orchestrator.workflows.steps \
+    import resync, set_status, store_process_subscription, unsync
 from orchestrator.workflows.utils import wrap_modify_initial_input_form
 
-from products import TrunkConfigSide
+from geant_service_orchestrator.products import TrunkConfigSide
 
 
-def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm:
+def initial_input_form_generator(
+        subscription_id: UUIDstr,
+        organisation: UUIDstr) -> InputForm:
     subscription = TrunkConfigSide.from_subscription(subscription_id)
 
     class TerminateForm(FormPage):
-        are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?"  # type:ignore
+        are_you_sure: Label = \
+            "Are you sure you want to remove " \
+            f"{subscription.description}?"  # type:ignore
 
     return TerminateForm
 
@@ -23,13 +28,14 @@ def _deprovision_in_gap(trunk_config_side_id: int) -> int:
 
 
 @step("Deprovision trunk config side")
-def deprovision_trunk_config_side(subscription: TrunkConfigSide) -> None:
+def deprovision_trunk_config_side(
+        subscription: TrunkConfigSide) -> None:
     _deprovision_in_gap(subscription.trunk_config_side.trunk_config_side_id)
 
 
 @workflow(
     "Terminate trunk config side",
-    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
+    initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),  # noqa: E501
     target=Target.TERMINATE,
 )
 def terminate_trunk_config_side():
@@ -42,4 +48,4 @@ def terminate_trunk_config_side():
         >> set_status(SubscriptionLifecycle.TERMINATED)
         >> resync
         >> done
-    )
\ No newline at end of file
+    )
diff --git a/requirements.txt b/requirements.txt
index 0ec76021395f5f7b8b484217be1246649d93d39f..5b0787674542104bfce569a6a6c79d9ee40b2351 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1,3 @@
 orchestrator-core
+
+pytest
diff --git a/test/test_placeholder.py b/test/test_placeholder.py
new file mode 100644
index 0000000000000000000000000000000000000000..e07460e2644214a04d3a149b0cf18c7de7367467
--- /dev/null
+++ b/test/test_placeholder.py
@@ -0,0 +1,4 @@
+# just a placeholder to be able to run tests during ci
+
+def test_placeholder():
+    pass
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000000000000000000000000000000000000..733d4a3712c670ce5d2a16107a74386366c606bb
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,18 @@
+[flake8]
+exclude = venv,.tox, migrations
+
+[testenv]
+deps =
+    coverage
+    flake8
+    -r requirements.txt
+
+commands =
+    coverage erase
+    coverage run --source geant_service_orchestrator -m pytest {posargs}
+    coverage xml
+    coverage html
+    # coverage report --fail-under 80
+    coverage report
+    flake8
+