diff --git a/workflows/line_card/.create_line_card.py.swp b/workflows/line_card/.create_line_card.py.swp
new file mode 100644
index 0000000000000000000000000000000000000000..4bc4099f8c808eb4832f035ef905610a91ef34b7
Binary files /dev/null and b/workflows/line_card/.create_line_card.py.swp differ
diff --git a/workflows/line_card/create_line_card.py b/workflows/line_card/create_line_card.py
index 3ff42c8be1e0c0c5e435f68bf147c1672f4e4a66..34f18dea0b92a5d00f75ffc20db352bfc9f542b7 100644
--- a/workflows/line_card/create_line_card.py
+++ b/workflows/line_card/create_line_card.py
@@ -1,13 +1,52 @@
+from typing import List
 from uuid import uuid4
 
+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 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.utils import wrap_create_initial_input_form
 
 from products.product_types.line_card import LineCardInactive, LineCardProvisioning
 from products.product_types.node import Node
 
+
+def node_selector() -> list:
+    node_subscriptions = {}
+    for node_id in (
+        SubscriptionTable.query.join(ProductTable)
+        .filter(
+            ProductTable.product_type == "Node",
+            SubscriptionTable.status == "active",
+        )
+        .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description)
+        .all()
+    ):
+        node_subscriptions[str(node_id)] = node_id
+
+    return choice_list(
+        Choice("NodeEnum", zip(node_subscriptions.keys(), node_subscriptions.items())),  # type:ignore
+        min_items=1,
+        max_items=1,
+    )
+
+
+def initial_input_form_generator(product_name: str) -> FormGenerator:
+
+    class CreateLineCardForm(FormPage):
+        class Config:
+            title = product_name
+
+        node_ids: node_selector()  # type:ignore
+
+    line_card_input = yield CreateLineCardForm
+
+    return line_card_input.dict()
+
+
 @step("Create subscription")
 def create_subscription(product: UUIDstr) -> State:
     subscription = LineCardInactive.from_product_id(product, uuid4())
@@ -15,16 +54,23 @@ def create_subscription(product: UUIDstr) -> State:
     return {"subscription": subscription, "subscription_id": subscription.subscription_id}
 
 @step("Initialize subscription")
-def initialize_subscription(subscription: LineCardInactive) -> State:
-    #subscription.line_card.
-    pass
+def initialize_subscription(subscription: LineCardInactive, node_ids: List[int]) -> State:
+    subscription.line_card.node_ref = Node.from_subscription(node_ids[0]).node
+    subscription.description = f"Line card"
+    subscription = LineCardProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)
+
+    return {"subscription": subscription}
 
 @step("Provision line card")
 def provision_line_card(subscription: LineCardProvisioning) -> State:
-    pass
+    line_card_id = abs(hash(uuid4()))
+    subscription.line_card.line_card_id = line_card_id
+
+
 
 @workflow(
     "Create line card",
+    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
     target=Target.CREATE,
 )
 def create_line_card():
diff --git a/workflows/node/create_node.py b/workflows/node/create_node.py
index 01c9b581eb48d6a2272bccc8aa5eafb71bf87584..c123dc89c27109bc12895005b2ef7ff04f9efdb6 100644
--- a/workflows/node/create_node.py
+++ b/workflows/node/create_node.py
@@ -22,7 +22,7 @@ def initialize_subscription(subscription: NodeInactive) -> State:
 
 @step("Provision node")
 def provision_node(subscription: NodeProvisioning) -> State:
-    node_id = uuid.uuid4()
+    node_id = abs(hash(uuid4()))
     subscription.node.node_id = node_id
 
 @workflow(
diff --git a/workflows/port/create_port.py b/workflows/port/create_port.py
index 529d2cf810f27fc75806c9c320f7212e2fdfa9c6..524c7285ce36edb6745f0babc2b68645171afbd4 100644
--- a/workflows/port/create_port.py
+++ b/workflows/port/create_port.py
@@ -1,13 +1,55 @@
+from typing import List, Optional
 from uuid import uuid4
 
+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 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.utils import wrap_create_initial_input_form
 
 from products.product_types.port import PortInactive, PortProvisioning
 from products.product_types.line_card import LineCard
 
+
+def line_card_selector() -> list:
+    line_card_subscriptions = {}
+    for line_card_id in (
+        SubscriptionTable.query.join(ProductTable)
+        .filter(
+            ProductTable.product_type == "LineCard",
+            SubscriptionTable.status == "active",
+        )
+        .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description)
+        .all()
+    ):
+        line_card_subscriptions[str(line_card_id)] = line_card_id
+
+    return choice_list(
+        Choice("NodeEnum", zip(line_card_subscriptions.keys(), line_card_subscriptions.items())),  # type:ignore
+        min_items=1,
+        max_items=1,
+    )
+
+
+def initial_input_form_generator(product_name: str) -> FormGenerator:
+
+    class CreatePortForm(FormPage):
+        class Config:
+            title = product_name
+
+        pic: int
+        position: int
+        interface: str
+        line_card_ids: line_card_selector()  # type:ignore
+
+    port_input = yield CreatePortForm
+
+    return port.dict()
+
+
 @step("Create subscription")
 def create_subscription(product: UUIDstr) -> State:
     subscription = PortInactive.from_product_id(product, uuid4())
@@ -15,15 +57,24 @@ def create_subscription(product: UUIDstr) -> State:
     return {"subscription": subscription, "subscription_id": subscription.subscription_id}
 
 @step("Initialize subscription")
-def initialize_subscription(subscription: PortInactive) -> State:
-    pass
+def initialize_subscription(subscription: PortInactive, pic: int, position: int, interface: str, line_card_ids: List[int]) -> State:
+    subscription.port.pic = pic
+    subscription.port.position = position
+    subscription.port.interface = interface
+    subscription.port.line_card_ref = LineCard.from_subscription(line_card_ids[0]).line_card
+    subscription.description = f"Port"
+    subscription = LineCardProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)
+
+    return {"subscription": subscription}
 
 @step("Provision port")
 def provision_port(subscription: PortProvisioning) -> State:
-    pass
+    port_id = abs(hash(uuid4()))
+    subscription.port.port_id = port_id
 
 @workflow(
     "Create port",
+    initial_input_form=wrap_create_initial_input_form(initial_input_form_generator),
     target=Target.CREATE,
 )
 def create_port():