diff --git a/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java b/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java
index 493680b..c405b75 100644
--- a/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java
+++ b/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java
@@ -887,10 +887,10 @@
         TrafficTreatment innerTreatment;
         if (noneValueVlanStatus) {
             innerTreatment = buildTreatment(innerPair.getLeft(), innerPair.getRight(), onuUsMeter,
-                                            fetchWriteMetadata(fwd), innerPbitSet,
+                                            writeMetadataExcludingCVlan(fwd), innerPbitSet,
                                             Instructions.transition(QQ_TABLE));
         } else {
-            innerTreatment = buildTreatment(innerPair.getRight(), onuUsMeter, fetchWriteMetadata(fwd),
+            innerTreatment = buildTreatment(innerPair.getRight(), onuUsMeter, writeMetadataExcludingCVlan(fwd),
                                             innerPbitSet, Instructions.transition(QQ_TABLE));
         }
 
@@ -950,7 +950,8 @@
                 .makePermanent()
                 .withPriority(fwd.priority())
                 .withSelector(fwd.selector())
-                .withTreatment(buildTreatment(Instructions.transition(QQ_TABLE), onuUsMeter, fetchWriteMetadata(fwd)));
+                .withTreatment(buildTreatment(Instructions.transition(QQ_TABLE), onuUsMeter,
+                        writeMetadataExcludingCVlan(fwd)));
 
         //match: in port and any-vlan (coming from OLT app.)
         //action: immediate: push:QinQ, vlanId (s-tag), write metadata, meter and output
@@ -1341,6 +1342,27 @@
                 fetchWriteMetadata(fwd).metadata() & 0xFFFF00000000L, 0L);
     }
 
+    /**
+     * Creates and returns the metadata excluding cVlan.
+     *
+     * This function can be used for following scenario.
+     *
+     * The cvlan field in the metadata is used to know that the packet is double or single tagged.
+     * For the ONU to know that the incoming packet at UNI is double tagged the innervlan is added in the cvlan field
+     * of the metadata for the upstream table 0 flows.
+     * As of now only FTTB workflows is using the double tagged at UNI. Other workflows, the cvlan should not be filled.
+     * If the cvlan is filled in the metadata the onu adapter will consider double tagged
+     * and configure rules accordingly.
+     *
+     * @param fwd ForwardingObjective
+     * @return Write Metadata Instruction
+     */
+    private Instruction writeMetadataExcludingCVlan(ForwardingObjective fwd) {
+
+        return Instructions.writeMetadata(
+                fetchWriteMetadata(fwd).metadata() & 0xFFFFFFFFFFFFL, 0L);
+    }
+
     private void fail(Objective obj, ObjectiveError error) {
         obj.context().ifPresent(context -> context.onError(obj, error));
     }
@@ -1455,10 +1477,10 @@
         TrafficTreatment innerTreatment;
         if (noneValueVlanStatus) {
             innerTreatment = buildTreatment(innerPair.getLeft(), innerPair.getRight(), onuUsMeter,
-                    fetchWriteMetadata(fwd), innerPbitSet,
+                    writeMetadataExcludingCVlan(fwd), innerPbitSet,
                     Instructions.transition(QQ_TABLE));
         } else {
-            innerTreatment = buildTreatment(innerPair.getRight(), onuUsMeter, fetchWriteMetadata(fwd),
+            innerTreatment = buildTreatment(innerPair.getRight(), onuUsMeter, writeMetadataExcludingCVlan(fwd),
                     innerPbitSet, Instructions.transition(QQ_TABLE));
         }
 
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java b/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
index 701450d..10be314 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
@@ -856,10 +856,12 @@
         // we can remove it based in the match
         FilteringObjective.Builder eapol;
 
+        // Setting VlanId.NONE as cvlan in the metadata as the packet will be single tagged
+        // and cvlan should not be filled.
         TrafficTreatment treatment = treatmentBuilder
                 .meter(meterId)
                 .writeMetadata(OltFlowServiceUtils.createTechProfValueForWriteMetadata(
-                        vlanId,
+                        VlanId.NONE,
                         techProfileId, oltMeterId), 0)
                 .setOutput(PortNumber.CONTROLLER)
                 .pushVlan()
@@ -1166,12 +1168,9 @@
                 .fromApp(appId)
                 .withPriority(MAX_PRIORITY);
 
-        VlanId cVlan = uti.getUniTagMatch();
-
         //VLAN changes and PCP matching need to happen only in the upstream directions
         if (direction == FlowDirection.UPSTREAM) {
             if (serviceName != null && serviceName.equals(FTTB_SERVICE_DPU_MGMT_TRAFFIC)) {
-                cVlan = VlanId.NONE;
                 FttbUtils.addUpstreamDhcpCondition(dhcpBuilder, uti);
                 FttbUtils.addUpstreamDhcpTreatment(treatmentBuilder, uti);
             } else {
@@ -1195,8 +1194,9 @@
         }
 
         if (uti.getTechnologyProfileId() != NONE_TP_ID) {
+            // Setting VlanId.NONE as cvlan, as the packet will be single tagged and cvlan should not be filled.
             treatmentBuilder.writeMetadata(
-                    OltFlowServiceUtils.createTechProfValueForWriteMetadata(cVlan,
+                    OltFlowServiceUtils.createTechProfValueForWriteMetadata(VlanId.NONE,
                             uti.getTechnologyProfileId(), oltMeterId), 0);
         }
 
@@ -1296,8 +1296,9 @@
         }
 
         if (techProfileId != NONE_TP_ID) {
-            treatmentBuilder.writeMetadata(OltFlowServiceUtils.createTechProfValueForWriteMetadata(cTag, techProfileId,
-                    oltMeterId), 0);
+            // Setting VlanId.NONE as cvlan as the packet will be single tagged and cvlan should not be filled.
+            treatmentBuilder.writeMetadata(OltFlowServiceUtils.createTechProfValueForWriteMetadata(VlanId.NONE,
+                    techProfileId, oltMeterId), 0);
         }
 
         DefaultFilteringObjective.Builder pppoedBuilder = ((action == FlowOperation.ADD)
diff --git a/impl/src/test/java/org/opencord/olt/impl/OltFlowServiceTest.java b/impl/src/test/java/org/opencord/olt/impl/OltFlowServiceTest.java
index 878078a..1525bcd 100644
--- a/impl/src/test/java/org/opencord/olt/impl/OltFlowServiceTest.java
+++ b/impl/src/test/java/org/opencord/olt/impl/OltFlowServiceTest.java
@@ -441,7 +441,7 @@
                         DefaultTrafficTreatment.builder()
                                 .meter(MeterId.meterId(1))
                                 .writeMetadata(OltFlowServiceUtils.createTechProfValueForWriteMetadata(
-                                        VlanId.vlanId(eapolDefaultVlan),
+                                        VlanId.NONE,
                                         component.defaultTechProfileId, MeterId.meterId(1)), 0)
                                 .setOutput(PortNumber.CONTROLLER)
                                 .pushVlan()
@@ -494,7 +494,7 @@
                         DefaultTrafficTreatment.builder()
                                 .meter(MeterId.meterId(1))
                                 .writeMetadata(OltFlowServiceUtils.createTechProfValueForWriteMetadata(
-                                        VlanId.vlanId(eapolDefaultVlan),
+                                        VlanId.NONE,
                                         component.defaultTechProfileId, MeterId.meterId(1)), 0)
                                 .setOutput(PortNumber.CONTROLLER)
                                 .pushVlan()
