diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py
index d1dd1864e3b935d0fc5e688ce50aae751891ed52..5bdf205d461287b74ed21fc572c0d5b723de7da0 100644
--- a/gso/services/provisioning_proxy.py
+++ b/gso/services/provisioning_proxy.py
@@ -1,6 +1,6 @@
 import logging
 
-from gso.products.product_types.device import DeviceBlock
+from gso.products.product_blocks.device import DeviceBlockProvisioning
 from gso import settings
 import requests
 
@@ -8,7 +8,8 @@ logger = logging.getLogger(__name__)
 
 
 def provision_node(
-        node_subscription_params: DeviceBlock,
+        node_subscription_params: DeviceBlockProvisioning,
+        callback_url: str,
         dry_run: bool = True):
     oss = settings.load_oss_params()
     pp_params = oss.PROVISIONING_PROXY
@@ -17,12 +18,14 @@ def provision_node(
     logger.debug(f'[disabled] provisioning node {node_subscription_params}')
 
     parameters = {
-        'callback': oss.GENERAL.public_hostname,  # TODO: implement
+        'callback': callback_url,
+        'dry_run': dry_run,
         'device': node_subscription_params.dict()
     }
 
     r = requests.post(
         f'https://{pp_params.api_base}'
         f'/api/device',
-        params=parameters)
+        json=parameters)
     r.raise_for_status()
+    requests.post()
\ No newline at end of file
diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py
index d3e0bfd0055f56688cfc01a32b0697e852dee0d8..2a492c392fd1988411b8ea79383914cf56ecb18f 100644
--- a/gso/workflows/device/create_device.py
+++ b/gso/workflows/device/create_device.py
@@ -11,8 +11,10 @@ from orchestrator.workflow import done, init, step, workflow
 from orchestrator.workflows.steps import resync, set_status
 from orchestrator.workflows.steps import store_process_subscription
 from orchestrator.workflows.utils import wrap_create_initial_input_form
+
+from gso import settings
+from gso.services import provisioning_proxy
 from gso.products.product_types import device
-# from gso.services import ipam, provisioning_proxy
 
 
 def initial_input_form_generator(product_name: str) -> FormGenerator:
@@ -96,12 +98,16 @@ def initialize_subscription(
 
 
 @step("Provision device [DRY RUN]")
-def provision_device_dry(
-    subscription: device.DeviceProvisioning,
-    fqdn: str,
-    ts_address: str,
-    ts_port: str
-) -> State:
+def provision_device_dry(subscription: device.DeviceProvisioning) -> State:
+    # TODO: verify this URL
+    callback_url = f'{settings.load_oss_params().GENERAL.public_hostname}' \
+                   f'/api/process/{subscription.product.product_id}/resume'
+
+    proxy_result = provisioning_proxy.provision_node(
+        subscription.device,
+        callback_url
+    )
+
     # import ansible_runner
     #
     # r = ansible_runner.run(
@@ -130,7 +136,7 @@ def provision_device_dry(
     #     dry_run=True)
     #  TODO: figure out what to return when we are suspending & waiting
     #        for the provisioning-proxy to call back
-    return {"return_code": 0}
+    return {"subscription": proxy_result}
 
 
 @inputstep("Confirm step", assignee="CHANGES")
@@ -150,6 +156,16 @@ def provision_device_real(
     ts_address: str,
     ts_port: str
 ) -> State:
+
+    # TODO: generate actual callback URL
+    callback_url = settings.load_oss_params().GENERAL.public_hostname
+
+    provisioning_proxy.provision_node(
+        subscription.device,
+        callback_url,
+        False
+    )
+
     # import ansible_runner
     #
     # r = ansible_runner.run(
@@ -176,7 +192,7 @@ def provision_device_real(
     #    node_subscription_params=subscription)
     # TODO: figure out what to return when we are suspending & waiting
     #       for the provisioning-proxy to call back
-    return {"return_code": 0}
+    return {"subscription": subscription}
 
 
 @workflow(