diff --git a/gso/migrations/versions/2024-03-28_2adf833f02a7_add_switch_lan_switch_interconnect_and_.py b/gso/migrations/versions/2024-03-28_2adf833f02a7_add_switch_lan_switch_interconnect_and_.py
new file mode 100644
index 0000000000000000000000000000000000000000..07d66822a16d5ae7e1651308db946b95fdffbd5b
--- /dev/null
+++ b/gso/migrations/versions/2024-03-28_2adf833f02a7_add_switch_lan_switch_interconnect_and_.py
@@ -0,0 +1,305 @@
+"""Add Switch, LAN Switch Interconnect and Pop VLAN products..
+
+Revision ID: 2adf833f02a7
+Revises:
+Create Date: 2024-03-28 09:29:47.139793
+
+"""
+import sqlalchemy as sa
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision = '2adf833f02a7'
+down_revision = None
+branch_labels = None
+depends_on = '4ec89ab289c0'
+
+
+def upgrade() -> None:
+    conn = op.get_bind()
+    conn.execute(sa.text("""
+INSERT INTO products (name, description, product_type, tag, status) VALUES ('Switch', 'Switch', 'Switch', 'SWITCH', 'active') RETURNING products.product_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO products (name, description, product_type, tag, status) VALUES ('LAN Switch Interconnect', 'LAN Switch Interconnect', 'LanSwitchInterconnect', 'LSI', 'active') RETURNING products.product_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO products (name, description, product_type, tag, status) VALUES ('Pop VLAN', 'Pop VLAN', 'PopVlan', 'POP_VLAN', 'active') RETURNING products.product_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('SwitchBlock', 'Switch product block', 'SWITCH_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectBlock', 'LAN Switch Interconnect product block', 'LSI_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectRouterSideBlock', 'LAN Switch Interconnect router side block', 'LSI_RTR_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectSwitchSideBlock', 'LAN Switch Interconnect switch side block', 'LSI_SWC_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('LanSwitchInterconnectInterfaceBlock', 'LAN Switch Interconnect interface block', 'LSI_IF_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanBlock', 'Pop VLAN Product block', 'POP_VLAN_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanRouterSideBlock', 'Pop VLAN router side block', 'POP_VLAN_RTR_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanSwitchSideBlock', 'Pop VLAN switch side block', 'POP_VLAN_SWC_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanPortBlock', 'Pop VLAN port block', 'POP_VLAN_PORT_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO product_blocks (name, description, tag, status) VALUES ('PopVlanInterfaceBlock', 'Pop VLAN interface block', 'POP_VLAN_IF_BLOCK', 'active') RETURNING product_blocks.product_block_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('lan_switch_interconnect_description', 'description') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('address_space', 'The address space of the VLAN Switch Interconnect.') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('port_description', 'Description of port') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('number_of_ports', 'Number of ports') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('port', 'A port consist of name, description and a bool field named tagged') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('switch_hostname', 'The hostname of a switch') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('ae_iface', 'AE interface name') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('switch_ts_port', 'TThe port of the terminal server') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('number_of_members', 'The number of members in the Pop VLAN.') RETURNING resource_types.resource_type_id
+    """))
+    conn.execute(sa.text("""
+INSERT INTO resource_types (resource_type, description) VALUES ('tagged', 'If the port is tagged or not') 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 ('Switch')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock')))
+    """))
+    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 ('LAN Switch Interconnect')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectBlock')))
+    """))
+    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 ('Pop VLAN')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanBlock')))
+    """))
+    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 ('SwitchBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SiteBlock')))
+    """))
+    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 ('LanSwitchInterconnectBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectRouterSideBlock')))
+    """))
+    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 ('LanSwitchInterconnectBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock')))
+    """))
+    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 ('LanSwitchInterconnectRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock')))
+    """))
+    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 ('LanSwitchInterconnectRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock')))
+    """))
+    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 ('LanSwitchInterconnectSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock')))
+    """))
+    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 ('PopVlanBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')))
+    """))
+    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 ('PopVlanBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock')))
+    """))
+    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 ('PopVlanBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanPortBlock')))
+    """))
+    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 ('PopVlanSwitchSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanInterfaceBlock'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanInterfaceBlock')))
+    """))
+    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 ('SwitchBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_hostname')))
+    """))
+    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 ('SwitchBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_ts_port')))
+    """))
+    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 ('LanSwitchInterconnectBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description')))
+    """))
+    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 ('LanSwitchInterconnectBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('address_space')))
+    """))
+    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 ('LanSwitchInterconnectBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members')))
+    """))
+    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 ('LanSwitchInterconnectRouterSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface')))
+    """))
+    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 ('PopVlanInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_name'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_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 ('PopVlanInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description'))), ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description')))
+    """))
+    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 ('PopVlanBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_ports')))
+    """))
+    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 ('PopVlanPortBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port')))
+    """))
+    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 ('PopVlanPortBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port_description')))
+    """))
+    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 ('PopVlanPortBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('tagged')))
+    """))
+
+
+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 ('SwitchBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_hostname'))
+    """))
+    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 ('SwitchBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_hostname'))
+    """))
+    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 ('SwitchBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_ts_port'))
+    """))
+    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 ('SwitchBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('switch_ts_port'))
+    """))
+    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 ('LanSwitchInterconnectBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description'))
+    """))
+    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 ('LanSwitchInterconnectBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description'))
+    """))
+    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 ('LanSwitchInterconnectBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('address_space'))
+    """))
+    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 ('LanSwitchInterconnectBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('address_space'))
+    """))
+    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 ('LanSwitchInterconnectBlock', 'PopVlanBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members'))
+    """))
+    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 ('LanSwitchInterconnectBlock', 'PopVlanBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_members'))
+    """))
+    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 ('LanSwitchInterconnectRouterSideBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'LanSwitchInterconnectSwitchSideBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))
+    """))
+    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 ('LanSwitchInterconnectRouterSideBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'LanSwitchInterconnectSwitchSideBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('ae_iface'))
+    """))
+    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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description'))
+    """))
+    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 ('PopVlanInterfaceBlock', 'LanSwitchInterconnectInterfaceBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('interface_description'))
+    """))
+    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 ('PopVlanBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_ports'))
+    """))
+    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 ('PopVlanBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('number_of_ports'))
+    """))
+    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 ('PopVlanPortBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port'))
+    """))
+    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 ('PopVlanPortBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port'))
+    """))
+    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 ('PopVlanPortBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port_description'))
+    """))
+    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 ('PopVlanPortBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('port_description'))
+    """))
+    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 ('PopVlanPortBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('tagged'))
+    """))
+    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 ('PopVlanPortBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('tagged'))
+    """))
+    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 ('lan_switch_interconnect_description', 'address_space', 'port_description', 'number_of_ports', 'port', 'switch_hostname', 'ae_iface', 'switch_ts_port', 'number_of_members', 'tagged'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM resource_types WHERE resource_types.resource_type IN ('lan_switch_interconnect_description', 'address_space', 'port_description', 'number_of_ports', 'port', 'switch_hostname', 'ae_iface', 'switch_ts_port', 'number_of_members', 'tagged')
+    """))
+    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 ('Switch')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock'))
+    """))
+    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 ('LAN Switch Interconnect')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectBlock'))
+    """))
+    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 ('Pop VLAN')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanBlock'))
+    """))
+    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 ('SwitchBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SiteBlock'))
+    """))
+    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 ('LanSwitchInterconnectBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectRouterSideBlock'))
+    """))
+    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 ('LanSwitchInterconnectBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectSwitchSideBlock'))
+    """))
+    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 ('LanSwitchInterconnectRouterSideBlock', 'PopVlanRouterSideBlock')) 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 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 ('LanSwitchInterconnectRouterSideBlock', 'LanSwitchInterconnectSwitchSideBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectInterfaceBlock'))
+    """))
+    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 ('LanSwitchInterconnectSwitchSideBlock', 'PopVlanSwitchSideBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SwitchBlock'))
+    """))
+    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 ('PopVlanBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanRouterSideBlock'))
+    """))
+    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 ('PopVlanBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanSwitchSideBlock'))
+    """))
+    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 ('PopVlanBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanPortBlock'))
+    """))
+    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 ('PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('PopVlanInterfaceBlock'))
+    """))
+    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 ('LanSwitchInterconnectRouterSideBlock', 'SwitchBlock', 'LanSwitchInterconnectSwitchSideBlock', 'PopVlanInterfaceBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'PopVlanPortBlock', 'LanSwitchInterconnectBlock', 'LanSwitchInterconnectInterfaceBlock', 'PopVlanBlock'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM product_blocks WHERE product_blocks.name IN ('LanSwitchInterconnectRouterSideBlock', 'SwitchBlock', 'LanSwitchInterconnectSwitchSideBlock', 'PopVlanInterfaceBlock', 'PopVlanSwitchSideBlock', 'PopVlanRouterSideBlock', 'PopVlanPortBlock', 'LanSwitchInterconnectBlock', 'LanSwitchInterconnectInterfaceBlock', 'PopVlanBlock')
+    """))
+    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 ('Pop VLAN', 'LAN Switch Interconnect', 'Switch'))))
+    """))
+    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 ('Pop VLAN', 'LAN Switch Interconnect', 'Switch')))
+    """))
+    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 ('Pop VLAN', 'LAN Switch Interconnect', 'Switch')))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Pop VLAN', 'LAN Switch Interconnect', 'Switch'))
+    """))
+    conn.execute(sa.text("""
+DELETE FROM products WHERE products.name IN ('Pop VLAN', 'LAN Switch Interconnect', 'Switch')
+    """))
diff --git a/gso/products/__init__.py b/gso/products/__init__.py
index 32350d65cc3a9b0e92e4757ffc8a7faf632f7379..cab8e801f207c7617c2e204cb9fdde0aa0d5a366 100644
--- a/gso/products/__init__.py
+++ b/gso/products/__init__.py
@@ -9,10 +9,13 @@ from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY
 from pydantic_forms.types import strEnum
 
 from gso.products.product_types.iptrunk import Iptrunk
+from gso.products.product_types.lan_switch_interconnect import LanSwitchInterconnect
 from gso.products.product_types.office_router import OfficeRouter
+from gso.products.product_types.pop_vlan import PopVlan
 from gso.products.product_types.router import Router
 from gso.products.product_types.site import Site
 from gso.products.product_types.super_pop_switch import SuperPopSwitch
+from gso.products.product_types.switch import Switch
 
 
 class ProductName(strEnum):
@@ -23,6 +26,9 @@ class ProductName(strEnum):
     SITE = "Site"
     SUPER_POP_SWITCH = "Super PoP switch"
     OFFICE_ROUTER = "Office router"
+    SWITCH = "Switch"
+    LAN_SWITCH_INTERCONNECT = "LAN Switch Interconnect"
+    POP_VLAN = "Pop VLAN"
 
 
 class ProductType(strEnum):
@@ -33,6 +39,9 @@ class ProductType(strEnum):
     SITE = Site.__name__
     SUPER_POP_SWITCH = SuperPopSwitch.__name__
     OFFICE_ROUTER = OfficeRouter.__name__
+    SWITCH = Switch.__name__
+    LAN_SWITCH_INTERCONNECT = LanSwitchInterconnect.__name__
+    POP_VLAN = PopVlan.__name__
 
 
 SUBSCRIPTION_MODEL_REGISTRY.update(
@@ -42,5 +51,8 @@ SUBSCRIPTION_MODEL_REGISTRY.update(
         ProductName.SITE.value: Site,
         ProductName.SUPER_POP_SWITCH.value: SuperPopSwitch,
         ProductName.OFFICE_ROUTER.value: OfficeRouter,
+        ProductName.SWITCH.value: Switch,
+        ProductName.LAN_SWITCH_INTERCONNECT.value: LanSwitchInterconnect,
+        ProductName.POP_VLAN.value: PopVlan,
     },
 )
diff --git a/gso/products/product_blocks/lan_switch_interconnect.py b/gso/products/product_blocks/lan_switch_interconnect.py
new file mode 100644
index 0000000000000000000000000000000000000000..08693fef09ff372623ddcdb36cd5759c4e1e088e
--- /dev/null
+++ b/gso/products/product_blocks/lan_switch_interconnect.py
@@ -0,0 +1,149 @@
+"""LAN Switch Interconnect product block that has all parameters of a subscription throughout its lifecycle."""
+
+from orchestrator.domain.base import ProductBlockModel
+from orchestrator.types import SubscriptionLifecycle, strEnum
+
+from gso.products.product_blocks.iptrunk import LAGMemberList
+from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning
+from gso.products.product_blocks.switch import SwitchBlock, SwitchBlockInactive, SwitchBlockProvisioning
+
+
+class LanSwitchInterconnectAddressSpace(strEnum):
+    """Types of LAN Switch Interconnect. Can be private or public."""
+
+    PRIVATE = "Private"
+    PUBLIC = "Public"
+
+
+class LanSwitchInterconnectInterfaceBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="LanSwitchInterconnectInterfaceBlock",
+):
+    """An inactive LAN Switch Interconnect interface."""
+
+    interface_name: str | None = None
+    interface_description: str | None = None
+
+
+class LanSwitchInterconnectInterfaceBlockProvisioning(
+    LanSwitchInterconnectInterfaceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]
+):
+    """A LAN Switch Interconnect interface that is being provisioned."""
+
+    interface_name: str
+    interface_description: str
+
+
+class LanSwitchInterconnectInterfaceBlock(
+    LanSwitchInterconnectInterfaceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]
+):
+    """An active Switch Interconnect interface."""
+
+    interface_name: str
+    interface_description: str
+
+
+class LanSwitchInterconnectRouterSideBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="LanSwitchInterconnectRouterSideBlock",
+):
+    """An inactive LAN Switch Interconnect router side."""
+
+    node: RouterBlockInactive
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockInactive]
+
+
+class LanSwitchInterconnectRouterSideBlockProvisioning(
+    LanSwitchInterconnectRouterSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]
+):
+    """An LAN Switch Interconnect router side that is being provisioned."""
+
+    node: RouterBlockProvisioning
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning]
+
+
+class LanSwitchInterconnectRouterSideBlock(
+    LanSwitchInterconnectRouterSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]
+):
+    """An active LAN Switch Interconnect router side."""
+
+    node: RouterBlock
+    ae_iface: str
+    ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock]
+
+
+class LanSwitchInterconnectSwitchSideBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="LanSwitchInterconnectSwitchSideBlock",
+):
+    """An inactive LAN Switch Interconnect switch side."""
+
+    node: SwitchBlockInactive
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockInactive]
+
+
+class LanSwitchInterconnectSwitchSideBlockProvisioning(
+    LanSwitchInterconnectSwitchSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]
+):
+    """An LAN Switch Interconnect switch side that is being provisioned."""
+
+    node: SwitchBlockProvisioning
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning]
+
+
+class LanSwitchInterconnectSwitchSideBlock(
+    LanSwitchInterconnectSwitchSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]
+):
+    """An active LAN Switch Interconnect switch side."""
+
+    node: SwitchBlock
+    ae_iface: str
+    ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock]
+
+
+class LanSwitchInterconnectBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="LanSwitchInterconnectBlock",
+):
+    """A LAN Switch Interconnect that's currently inactive, see :class:`LanSwitchInterconnectBlock`."""
+
+    lan_switch_interconnect_description: str | None = None
+    address_space: LanSwitchInterconnectAddressSpace | None = None
+    number_of_members: int | None = None
+    router_side: LanSwitchInterconnectRouterSideBlockInactive
+    switch_side: LanSwitchInterconnectSwitchSideBlockInactive
+
+
+class LanSwitchInterconnectBlockProvisioning(
+    LanSwitchInterconnectBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]
+):
+    """A LAN Switch Interconnect that's currently being provisioned, see :class:`LanSwitchInterconnectBlock`."""
+
+    lan_switch_interconnect_description: str | None = None
+    address_space: LanSwitchInterconnectAddressSpace | None = None
+    number_of_members: int | None = None
+    router_side: LanSwitchInterconnectRouterSideBlockProvisioning
+    switch_side: LanSwitchInterconnectSwitchSideBlockProvisioning
+
+
+class LanSwitchInterconnectBlock(LanSwitchInterconnectBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A LAN Switch Interconnect that's currently deployed in the network."""
+
+    #:  A human-readable description of this LAN Switch Interconnect.
+    lan_switch_interconnect_description: str
+    #:  The address space of the VLAN Switch Interconnect. It can be private or public.
+    address_space: LanSwitchInterconnectAddressSpace
+    #:  The minimum amount of links the LAN Switch Interconnect should consist of.
+    number_of_members: int
+    #:  The router side of the LAN Switch Interconnect.
+    router_side: LanSwitchInterconnectRouterSideBlock
+    #:  The switch side of the LAN Switch Interconnect.
+    switch_side: LanSwitchInterconnectSwitchSideBlock
diff --git a/gso/products/product_blocks/pop_vlan.py b/gso/products/product_blocks/pop_vlan.py
new file mode 100644
index 0000000000000000000000000000000000000000..9840299c80c8dffa9cb270d0f381f7ed47e42ea8
--- /dev/null
+++ b/gso/products/product_blocks/pop_vlan.py
@@ -0,0 +1,167 @@
+"""Pop VLAN product block that has all parameters of a subscription throughout its lifecycle."""
+
+from typing import TypeVar
+
+from orchestrator.domain.base import ProductBlockModel
+from orchestrator.forms.validators import UniqueConstrainedList
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.iptrunk import LAGMemberList
+from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning
+from gso.products.product_blocks.switch import SwitchBlock, SwitchBlockInactive, SwitchBlockProvisioning
+
+T_co = TypeVar("T_co", covariant=True)
+
+
+class PortList(UniqueConstrainedList[T_co]):  # type: ignore[type-var]
+    """A list of ports."""
+
+
+class PopVlanPortBlockInactive(
+    ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="PopVlanPortBlock"
+):
+    """An inactive Pop VLAN port."""
+
+    port: str | None = None
+    port_description: str | None = None
+    tagged: bool | None = None
+
+
+class PopVlanPortBlockProvisioning(PopVlanPortBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A Pop VLAN port that is being provisioned."""
+
+    port: str | None = None
+    port_description: str | None = None
+    tagged: bool | None = None
+
+
+class PopVlanPortBlock(PopVlanPortBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An active Pop VLAN port."""
+
+    port: str
+    port_description: str
+    tagged: bool
+
+
+class PopVlanInterfaceBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="PopVlanInterfaceBlock",
+):
+    """An inactive Pop VLAN interface."""
+
+    interface_name: str | None = None
+    interface_description: str | None = None
+
+
+class PopVlanInterfaceBlockProvisioning(PopVlanInterfaceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A Pop VLAN interface that is being provisioned."""
+
+    interface_name: str
+    interface_description: str
+
+
+class PopVlanInterfaceBlock(PopVlanInterfaceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An active Pop VLAN interface."""
+
+    interface_name: str
+    interface_description: str
+
+
+class PopVlanRouterSideBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="PopVlanRouterSideBlock",
+):
+    """An inactive Pop VLAN router side."""
+
+    node: RouterBlockInactive
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[PopVlanInterfaceBlockInactive]
+
+
+class PopVlanRouterSideBlockProvisioning(
+    PopVlanRouterSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]
+):
+    """An Pop VLAN router side that is being provisioned."""
+
+    node: RouterBlockProvisioning
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[PopVlanInterfaceBlockProvisioning]
+
+
+class PopVlanRouterSideBlock(PopVlanRouterSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An active Pop VLAN router side."""
+
+    node: RouterBlock
+    ae_iface: str
+    ae_members: LAGMemberList[PopVlanInterfaceBlock]
+
+
+class PopVlanSwitchSideBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="PopVlanSwitchSideBlock",
+):
+    """An inactive Pop VLAN switch side."""
+
+    node: SwitchBlockInactive
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[PopVlanInterfaceBlockInactive]
+
+
+class PopVlanSwitchSideBlockProvisioning(
+    PopVlanSwitchSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]
+):
+    """An Pop VLAN switch side that is being provisioned."""
+
+    node: SwitchBlockProvisioning
+    ae_iface: str | None = None
+    ae_members: LAGMemberList[PopVlanInterfaceBlockProvisioning]
+
+
+class PopVlanSwitchSideBlock(PopVlanSwitchSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An active Pop VLAN switch side."""
+
+    node: SwitchBlock
+    ae_iface: str
+    ae_members: LAGMemberList[PopVlanInterfaceBlock]
+
+
+class PopVlanBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="PopVlanBlock",
+):
+    """A Pop VLAN that's currently inactive, see :class:`PopVlanBlock`."""
+
+    number_of_ports: int | None = None
+    number_of_members: int | None = None
+    router_side: PopVlanRouterSideBlockInactive
+    switch_side: PopVlanSwitchSideBlockInactive
+    ports: PortList[PopVlanPortBlockInactive]
+
+
+class PopVlanBlockProvisioning(PopVlanBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A Pop VLAN that's currently being provisioned, see :class:`PopVlanBlock`."""
+
+    number_of_ports: int | None = None
+    number_of_members: int | None = None
+    router_side: PopVlanRouterSideBlockProvisioning
+    switch_side: PopVlanSwitchSideBlockProvisioning
+    ports: PortList[PopVlanPortBlockProvisioning]
+
+
+class PopVlanBlock(PopVlanBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A Pop VLAN that's currently deployed in the network."""
+
+    #:  The number of ports in the Pop VLAN.
+    number_of_ports: int
+    #:  The number of members in the Pop VLAN.
+    number_of_members: int
+    #:  The router side of the Pop VLAN.
+    router_side: PopVlanRouterSideBlock
+    #:  The switch side of the Pop VLAN.
+    switch_side: PopVlanSwitchSideBlock
+    #:  The ports of the Pop VLAN.
+    ports: PortList[PopVlanPortBlock]
diff --git a/gso/products/product_blocks/switch.py b/gso/products/product_blocks/switch.py
new file mode 100644
index 0000000000000000000000000000000000000000..42f920a86689ce5cf132aa243b2c86c43e94a5b8
--- /dev/null
+++ b/gso/products/product_blocks/switch.py
@@ -0,0 +1,42 @@
+"""Product block for :class:`Switch` products."""
+
+from orchestrator.domain.base import ProductBlockModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.site import (
+    SiteBlock,
+    SiteBlockInactive,
+    SiteBlockProvisioning,
+)
+from gso.utils.shared_enums import PortNumber
+
+
+class SwitchBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="SwitchBlock",
+):
+    """A switch that's being currently inactive. See :class:`SwitchBlock`."""
+
+    switch_hostname: str | None = None
+    switch_ts_port: PortNumber | None = None
+    switch_site: SiteBlockInactive | None
+
+
+class SwitchBlockProvisioning(SwitchBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A switch that's being provisioned. See :class:`SwitchBlock`."""
+
+    switch_hostname: str
+    switch_ts_port: PortNumber
+    switch_site: SiteBlockProvisioning
+
+
+class SwitchBlock(SwitchBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A switch that's currently deployed in the network."""
+
+    #: The hostname of the switch.
+    switch_hostname: str
+    #:  The port of the terminal server that this switch is connected to. Used to offer out of band access.
+    switch_ts_port: PortNumber
+    #:  The :class:`Site` that this switch resides in. Both physically and computationally.
+    switch_site: SiteBlock
diff --git a/gso/products/product_types/lan_switch_interconnect.py b/gso/products/product_types/lan_switch_interconnect.py
new file mode 100644
index 0000000000000000000000000000000000000000..32433c4694b0f097bcdc80df742ca9695a9dee53
--- /dev/null
+++ b/gso/products/product_types/lan_switch_interconnect.py
@@ -0,0 +1,28 @@
+"""The product type for LAN Switch Interconnect."""
+
+from orchestrator.domain.base import SubscriptionModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.lan_switch_interconnect import (
+    LanSwitchInterconnectBlock,
+    LanSwitchInterconnectBlockInactive,
+    LanSwitchInterconnectBlockProvisioning,
+)
+
+
+class LanSwitchInterconnectInactive(SubscriptionModel, is_base=True):
+    """An LAN Switch Interconnect that is inactive."""
+
+    lan_switch_interconnect: LanSwitchInterconnectBlockInactive
+
+
+class LanSwitchInterconnectProvisioning(LanSwitchInterconnectInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """An LAN Switch Interconnect that is being provisioned."""
+
+    lan_switch_interconnect: LanSwitchInterconnectBlockProvisioning
+
+
+class LanSwitchInterconnect(LanSwitchInterconnectProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An LAN Switch Interconnect that is active."""
+
+    lan_switch_interconnect: LanSwitchInterconnectBlock
diff --git a/gso/products/product_types/pop_vlan.py b/gso/products/product_types/pop_vlan.py
new file mode 100644
index 0000000000000000000000000000000000000000..7567f4ea8014bbd49fa66b6204839d2596cccb30
--- /dev/null
+++ b/gso/products/product_types/pop_vlan.py
@@ -0,0 +1,24 @@
+"""The product type for Pop VLAN."""
+
+from orchestrator.domain.base import SubscriptionModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.pop_vlan import PopVlanBlock, PopVlanBlockInactive, PopVlanBlockProvisioning
+
+
+class PopVlanInactive(SubscriptionModel, is_base=True):
+    """A Pop VLAN that is inactive."""
+
+    pop_vlan: PopVlanBlockInactive
+
+
+class PopVlanProvisioning(PopVlanInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A Pop VLAN that is being provisioned."""
+
+    pop_vlan: PopVlanBlockProvisioning
+
+
+class PopVlan(PopVlanProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A Pop VLAN that is active."""
+
+    pop_vlan: PopVlanBlock
diff --git a/gso/products/product_types/switch.py b/gso/products/product_types/switch.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef2eb05eac333628ba4ae5bef2424283adec3758
--- /dev/null
+++ b/gso/products/product_types/switch.py
@@ -0,0 +1,24 @@
+"""A switch product type."""
+
+from orchestrator.domain.base import SubscriptionModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.switch import SwitchBlock, SwitchBlockInactive, SwitchBlockProvisioning
+
+
+class SwitchInactive(SubscriptionModel, is_base=True):
+    """An inactive switch."""
+
+    switch: SwitchBlockInactive
+
+
+class SwitchProvisioning(SwitchInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A switch that is being provisioned."""
+
+    switch: SwitchBlockProvisioning
+
+
+class Switch(SwitchProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A switch that is currently active."""
+
+    switch: SwitchBlock