diff --git a/Changelog.md b/Changelog.md
index e88b0515ae3bf8c12debdf90aa836c8e1bb8a8fc..6a9206e1dd3b14427089b11501ac23acbe81f4ff 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,38 +1,41 @@
 # Changelog
 
-# [3.10] - 2025-06-17
-- Added parallelized massive base config redeploy
+## [3.11] - 2025-06-18
+- Update subscription descriptions for Layer 2 Circuit products.
+
+## [3.10] - 2025-06-17
+- Added parallelized massive base config redeploy.
 - Added and integrated R&E Peer and R&E LHCONE workflows, product types, and related migrations.
 
-# [3.9] - 2025-06-05
+## [3.9] - 2025-06-05
 - Add threshold input for BGP routes in L3 Core migration workflows and forward the value to Moodi.
 
-# [3.8] - 2025-05-28
-- Add backfill service version for IP Trunks
+## [3.8] - 2025-05-28
+- Add backfill service version for IP Trunks.
 
-# [3.7] - 2025-05-26
-- Add service version for IP Trunks
+## [3.7] - 2025-05-26
+- Add service version for IP Trunks.
 
-# [3.6] - 2025-05-15
+## [3.6] - 2025-05-15
 - Stop validating Edge Ports that are on a Juniper router.
 - Allow skipping Ansible steps in the Edge Port termination workflow.
 - Update translations.
 
-# [3.5] - 2025-05-12
+## [3.5] - 2025-05-12
 - Add a new CLI command for interacting with the task scheduler.
 - Fix a bug in the subscription validation task.
 
-# [3.4] - 2025-05-08
+## [3.4] - 2025-05-08
 - Fix some bugs in the nightly validation schedule.
 
-# [3.3] - 2025-05-07
+## [3.3] - 2025-05-07
 - Fix CLI bug for importing L3 core services.
 
-# [3.2] - 2025-05-02
+## [3.2] - 2025-05-02
 - Allow running the Edge Port modification workflow on Juniper routers.
 - Update labels of IAS flavors.
 
-# [3.1] - 2025-04-29
+## [3.1] - 2025-04-29
 - Allow running the prefix validation workflow on out-of-sync subscriptions
 - Only check Kentik licenses during router validation in production
 - Add optional TTL security field to BGP session product block
diff --git a/gso/migrations/versions/2025-06-17_550e3aebc1c5_update_l2c_descriptions.py b/gso/migrations/versions/2025-06-17_550e3aebc1c5_update_l2c_descriptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..dd9826c8dcda1227396b5cc52b15d9cb47dfc9ee
--- /dev/null
+++ b/gso/migrations/versions/2025-06-17_550e3aebc1c5_update_l2c_descriptions.py
@@ -0,0 +1,54 @@
+"""Update Layer 2 Circuit subscription descriptions.
+
+Revision ID: 550e3aebc1c5
+Revises: d23b59abc6a5
+Create Date: 2025-06-04 16:08:56.288635
+
+This database migration updates the description of all Layer2Circuit-type subscriptions by having fit the format:
+``product_name - custom_service_name``.
+"""
+import sqlalchemy as sa
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision = '550e3aebc1c5'
+down_revision = 'd23b59abc6a5'
+branch_labels = None
+depends_on = None
+
+
+def upgrade() -> None:
+    conn = op.get_bind()
+    conn.execute(sa.text("""
+UPDATE subscriptions s
+SET    description = (
+           Regexp_replace(subscriptions.description, '^(.+) - .+$', '\\1 - ') || 
+           subscription_instance_values.value
+       )
+FROM   subscriptions
+       JOIN products
+         ON subscriptions.product_id = products.product_id
+       JOIN product_product_blocks
+         ON products.product_id = product_product_blocks.product_id
+       JOIN product_block_resource_types
+         ON product_product_blocks.product_block_id =
+            product_block_resource_types.product_block_id
+       JOIN resource_types
+         ON product_block_resource_types.resource_type_id =
+            resource_types.resource_type_id
+       JOIN subscription_instances
+         ON subscriptions.subscription_id =
+            subscription_instances.subscription_id
+       JOIN subscription_instance_values
+         ON ( resource_types.resource_type_id =
+              subscription_instance_values.resource_type_id
+              AND subscription_instances.subscription_instance_id =
+                  subscription_instance_values.subscription_instance_id )
+WHERE  resource_types.resource_type = 'custom_service_name'
+       AND products.product_type = 'Layer2Circuit'
+       AND s.subscription_id = subscriptions.subscription_id;
+    """))
+
+
+def downgrade() -> None:
+    pass
diff --git a/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py b/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py
index 8b835edc12ea4c87ffb22aad7308fdf625f8ba21..983657269ba7cf356441c175424be39f2d53fb42 100644
--- a/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py
+++ b/gso/workflows/l2_circuit/create_imported_layer_2_circuit.py
@@ -128,7 +128,7 @@ def initialize_subscription(
     subscription.layer_2_circuit.bandwidth = policer_bandwidth
     subscription.layer_2_circuit.policer_burst_rate = policer_burst_rate
     subscription.layer_2_circuit.custom_service_name = custom_service_name
-    subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.virtual_circuit_id}"
+    subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.custom_service_name}"
 
     return {"subscription": subscription}
 
diff --git a/gso/workflows/l2_circuit/create_layer_2_circuit.py b/gso/workflows/l2_circuit/create_layer_2_circuit.py
index ce70f215fa60ee80cc9a7a4f0240bec8729a370e..87265aa96f2aab9b5fc64783d912cd125de8b4ce 100644
--- a/gso/workflows/l2_circuit/create_layer_2_circuit.py
+++ b/gso/workflows/l2_circuit/create_layer_2_circuit.py
@@ -141,7 +141,7 @@ def initialize_subscription(
     subscription.layer_2_circuit.bandwidth = policer_bandwidth
     subscription.layer_2_circuit.policer_burst_rate = policer_burst_rate
     subscription.layer_2_circuit.custom_service_name = custom_service_name
-    subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.virtual_circuit_id}"
+    subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.custom_service_name}"
 
     subscription = Layer2Circuit.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)
     fqdn_list = [side.sbp.edge_port.node.router_fqdn for side in subscription.layer_2_circuit.layer_2_circuit_sides]
diff --git a/gso/workflows/l2_circuit/modify_layer_2_circuit.py b/gso/workflows/l2_circuit/modify_layer_2_circuit.py
index ae879037c0700a515ca7d2507fbad6eba7d83715..f3ab500ea39bec1c2d8a403dc58a40ebb90deaa2 100644
--- a/gso/workflows/l2_circuit/modify_layer_2_circuit.py
+++ b/gso/workflows/l2_circuit/modify_layer_2_circuit.py
@@ -126,6 +126,7 @@ def modify_layer_2_circuit_subscription(
         subscription.layer_2_circuit.layer_2_circuit_sides[1].sbp.vlan_id = layer_2_circuit_side_b.get("vlan_id")
     for layer_2_circuit_side in subscription.layer_2_circuit.layer_2_circuit_sides:
         layer_2_circuit_side.sbp.is_tagged = layer_2_circuit_type == Layer2CircuitType.VLAN
+    subscription.description = f"{subscription.product.name} - {subscription.layer_2_circuit.custom_service_name}"
 
     return {"subscription": subscription}
 
diff --git a/setup.py b/setup.py
index 7074b11a0af2530071866ebc7d889539188b9c71..7a013462e2b7170b142309c2ea0c5fb685505bed 100644
--- a/setup.py
+++ b/setup.py
@@ -4,7 +4,7 @@ from setuptools import find_packages, setup
 
 setup(
     name="geant-service-orchestrator",
-    version="3.10",
+    version="3.11",
     author="GÉANT Orchestration and Automation Team",
     author_email="goat@geant.org",
     description="GÉANT Service Orchestrator",