diff --git a/gso/migrations/versions/2024-11-26_4b5bbefb296f_add_vrf_and_importedvrf_products.py b/gso/migrations/versions/2024-11-26_4b5bbefb296f_add_vrf_and_importedvrf_products.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec1887aea7f363ced93f1e040d803155643507d2
--- /dev/null
+++ b/gso/migrations/versions/2024-11-26_4b5bbefb296f_add_vrf_and_importedvrf_products.py
@@ -0,0 +1,107 @@
+"""Add VRF and ImportedVRF products..
+
+Revision ID: 4b5bbefb296f
+Revises: 0e7e7d749617
+Create Date: 2024-11-26 10:28:41.081655
+
+"""
+import sqlalchemy as sa
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision = '4b5bbefb296f'
+down_revision = '0e7e7d749617'
+branch_labels = None
+depends_on = None
+
+
+def upgrade() -> None:
+    conn = op.get_bind()
+    conn.execute(sa.text("""
+INSERT INTO products (name, description, product_type, tag, status) VALUES ('VRF', 'Virtual Routing and Forwarding product', 'VRF', 'VRF', 'active') RETURNING products.product_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO products (name, description, product_type, tag, status) VALUES ('Imported VRF', 'Imported Virtual Routing and Forwarding products', 'ImportedVRF', 'IMP_VRF', 'active') RETURNING products.product_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('VRFBlock', 'Virtual Routing and Forwarding product block', 'VRF_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('vrf_name', 'Unique name identifying this VRF') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('route_distinguisher', 'Route Distinguisher (RD) ensuring unique route identification within this VRF') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('route_target', 'Route Target (RT) defining routing policies for importing/exporting routes') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_product_blocks (product_id, product_block_id) VALUES ((SELECT products.product_id FROM products WHERE products.name IN ('VRF')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))), ((SELECT products.product_id FROM products WHERE products.name IN ('Imported VRF')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')))
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_block_relations (in_use_by_id, depends_on_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock')))
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('vrf_name')))
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_distinguisher')))
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_target')))
+    """))
+
+
+def downgrade() -> None:
+    conn = op.get_bind()
+    conn.execute(sa.text("""
+DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('vrf_name'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('vrf_name'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_distinguisher'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_distinguisher'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_target'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('route_target'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscription_instance_values WHERE subscription_instance_values.resource_type_id IN (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('vrf_name', 'route_distinguisher', 'route_target'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM resource_types WHERE resource_types.resource_type IN ('vrf_name', 'route_distinguisher', 'route_target')
+    """))
+    conn.execute(sa.text("""
+DELETE FROM product_product_blocks WHERE product_product_blocks.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('VRF', 'Imported VRF')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM product_block_relations WHERE product_block_relations.in_use_by_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscription_instances WHERE subscription_instances.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('VRFBlock'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM product_blocks WHERE product_blocks.name IN ('VRFBlock')
+    """))
+    conn.execute(sa.text("""
+DELETE FROM processes WHERE processes.pid IN (SELECT processes_subscriptions.pid FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('VRF', 'Imported VRF'))))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('VRF', 'Imported VRF')))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscription_instances WHERE subscription_instances.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('VRF', 'Imported VRF')))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('VRF', 'Imported VRF'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM products WHERE products.name IN ('VRF', 'Imported VRF')
+    """))
diff --git a/gso/products/__init__.py b/gso/products/__init__.py
index 4b472c9f8a4f186bca00aea8bf70507981c0b7da..ed60b97e7c297ac667844ff96e2466222adc5f66 100644
--- a/gso/products/__init__.py
+++ b/gso/products/__init__.py
@@ -20,6 +20,7 @@ from gso.products.product_types.router import ImportedRouter, Router
 from gso.products.product_types.site import ImportedSite, Site
 from gso.products.product_types.super_pop_switch import ImportedSuperPopSwitch, SuperPopSwitch
 from gso.products.product_types.switch import ImportedSwitch, Switch
+from gso.products.product_types.vrf import VRF, ImportedVRF
 
 
 class ProductName(strEnum):
@@ -58,6 +59,8 @@ class ProductName(strEnum):
     IMPORTED_GEANT_PLUS = Layer2CircuitServiceType.IMPORTED_GEANT_PLUS
     EXPRESSROUTE = Layer2CircuitServiceType.EXPRESSROUTE
     IMPORTED_EXPRESSROUTE = Layer2CircuitServiceType.IMPORTED_EXPRESSROUTE
+    VRF = "VRF"
+    IMPORTED_VRF = "Imported VRF"
 
 
 class ProductType(strEnum):
@@ -96,6 +99,8 @@ class ProductType(strEnum):
     IMPORTED_GEANT_PLUS = ImportedLayer2Circuit.__name__
     EXPRESSROUTE = Layer2Circuit.__name__
     IMPORTED_EXPRESSROUTE = ImportedLayer2Circuit.__name__
+    VRF = VRF.__name__
+    IMPORTED_VRF = ImportedVRF.__name__
 
 
 SUBSCRIPTION_MODEL_REGISTRY.update(
@@ -133,6 +138,8 @@ SUBSCRIPTION_MODEL_REGISTRY.update(
         ProductName.IMPORTED_GEANT_PLUS.value: ImportedLayer2Circuit,
         ProductName.EXPRESSROUTE.value: Layer2Circuit,
         ProductName.IMPORTED_EXPRESSROUTE.value: ImportedLayer2Circuit,
+        ProductName.VRF.value: VRF,
+        ProductName.IMPORTED_VRF.value: ImportedVRF,
     },
 )
 
diff --git a/gso/products/product_blocks/vrf.py b/gso/products/product_blocks/vrf.py
index 0c4bd10be1082e890d7b418a365932cfc9c267c4..59cf3388edb38ba80ca5d93fb883707f4c933ed5 100644
--- a/gso/products/product_blocks/vrf.py
+++ b/gso/products/product_blocks/vrf.py
@@ -1,4 +1,4 @@
-"""Product blocks for VRF."""
+"""Product blocks for :term:`VRF` Virtual Routing and Forwarding."""
 
 from orchestrator.domain.base import ProductBlockModel
 from orchestrator.types import SubscriptionLifecycle
diff --git a/gso/products/product_types/vrf.py b/gso/products/product_types/vrf.py
new file mode 100644
index 0000000000000000000000000000000000000000..ee322cd714744f43ee9e9ba56cb263233373f72e
--- /dev/null
+++ b/gso/products/product_types/vrf.py
@@ -0,0 +1,36 @@
+"""A :term:`VRF` product type."""
+
+from orchestrator.domain.base import SubscriptionModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.vrf import VRFBlock, VRFBlockInactive, VRFBlockProvisioning
+
+
+class VRFInactive(SubscriptionModel, is_base=True):
+    """An inactive :term:`VRF`."""
+
+    vrf: VRFBlockInactive
+
+
+class VRFProvisioning(VRFInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A provisioning :term:`VRF`."""
+
+    vrf: VRFBlockProvisioning
+
+
+class VRF(VRFProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A :term:`VRF` that is currently active."""
+
+    vrf: VRFBlock
+
+
+class ImportedVRFInactive(SubscriptionModel, is_base=True):
+    """An imported, inactive :term:`VRF`."""
+
+    vrf: VRFBlockInactive
+
+
+class ImportedVRF(ImportedVRFInactive, llifecycle=[SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE]):
+    """An imported :term:`VRF` that is currently active."""
+
+    vrf: VRFBlock