diff --git a/internal/pkg/application/application.go b/internal/pkg/application/application.go
index fa9e649..74b72f8 100644
--- a/internal/pkg/application/application.go
+++ b/internal/pkg/application/application.go
@@ -215,6 +215,7 @@
 	FlowDelEventMap              *util.ConcurrentMap //map[string]*FlowEvent
 	MigratingServices            *util.ConcurrentMap //<vnetID,<RequestID, MigrateServicesRequest>>
 	GlobalDhcpFlowAdded          bool
+	NniDhcpTrapVid               of.VlanType
 }
 
 // NewVoltDevice : Constructor for the device
@@ -234,6 +235,11 @@
 	d.FlowAddEventMap = util.NewConcurrentMap()
 	d.FlowDelEventMap = util.NewConcurrentMap()
 	d.GlobalDhcpFlowAdded = false
+	if config, ok := GetApplication().DevicesConfig.Load(slno); ok {
+		//Update nni dhcp vid
+		deviceConfig := config.(DeviceConfig)
+		d.NniDhcpTrapVid = of.VlanType(deviceConfig.NniDhcpTrapVid)
+	}
 	return &d
 }
 
@@ -443,6 +449,7 @@
 	PortAlarmProfileCache     map[string]map[string]int // [portAlarmID][ThresholdLevelString]ThresholdLevel
 	vendorID                  string
 	OltFlowServiceConfig      OltFlowService
+	DevicesConfig             sync.Map
 }
 
 // PonPortCfg contains NB port config and activeIGMPChannels count
@@ -791,14 +798,16 @@
 
 // GetDeviceBySerialNo to get a device by serial number.
 // TODO - Transform this into a MAP instead
-func (va *VoltApplication) GetDeviceBySerialNo(slno string) *VoltDevice {
+func (va *VoltApplication) GetDeviceBySerialNo(slno string) (*VoltDevice, string) {
 	var device *VoltDevice
+	var deviceID string
 	getserial := func(key interface{}, value interface{}) bool {
 		device = value.(*VoltDevice)
+		deviceID = key.(string)
 		return device.SerialNum != slno
 	}
 	va.DevicesDisc.Range(getserial)
-	return device
+	return device, deviceID
 }
 
 // PortAddInd : This is a PORT add indication coming from the VPAgent, which is essentially
@@ -1740,7 +1749,7 @@
 // UpdateDeviceSerialNumberList to update the device serial number list after device serial number is updated for vnet and mvlan
 func (va *VoltApplication) UpdateDeviceSerialNumberList(oldOltSlNo string, newOltSlNo string) {
 
-	voltDevice := va.GetDeviceBySerialNo(oldOltSlNo)
+	voltDevice, _ := va.GetDeviceBySerialNo(oldOltSlNo)
 
 	if voltDevice != nil {
 		// Device is present with old serial number ID
@@ -2080,7 +2089,7 @@
 		if vnetIntf, _ := va.VnetsByName.Load(vnetName); vnetIntf != nil {
 			vnet := vnetIntf.(*VoltVnet)
 			logger.Warnw(ctx, "Triggering Pending Vnet flows delete", log.Fields{"Vnet": vnet.Name})
-			if d := va.GetDeviceBySerialNo(vnet.PendingDeviceToDelete); d != nil && d.SerialNum == vnet.PendingDeviceToDelete {
+			if d, _ := va.GetDeviceBySerialNo(vnet.PendingDeviceToDelete); d != nil && d.SerialNum == vnet.PendingDeviceToDelete {
 				va.DeleteDevFlowForVlanFromDevice(cntx, vnet, vnet.PendingDeviceToDelete)
 				va.deleteVnetConfig(vnet)
 			} else {
@@ -2124,3 +2133,34 @@
 	}
 	logger.Infow(ctx, "updated OltFlowServiceConfig from DB", log.Fields{"OltFlowServiceConfig": va.OltFlowServiceConfig})
 }
+
+type DeviceConfig struct {
+	SerialNumber       string
+	UplinkPort         int
+	HardwareIdentifier string
+	IPAddress          net.IP
+	NasID              string
+	NniDhcpTrapVid     int
+}
+
+func (va *VoltApplication) UpdateDeviceConfig(cntx context.Context, sn, mac, nasID string, port, dhcpVid int, ip net.IP) {
+	if d, ok := va.DevicesConfig.Load(sn); ok {
+		logger.Infow(ctx, "Device configuration already exists", log.Fields{"DeviceInfo": d})
+	}
+	d := DeviceConfig {
+		SerialNumber       : sn,
+		UplinkPort         : port,
+		HardwareIdentifier : mac,
+		IPAddress          : ip,
+		NasID              : nasID,
+		NniDhcpTrapVid     : dhcpVid,
+	}
+	logger.Infow(ctx, "Added OLT configurations", log.Fields{"DeviceInfo": d})
+	va.DevicesConfig.Store(sn, d)
+	// If device is already discovered update the VoltDevice structure
+	device, id := va.GetDeviceBySerialNo(sn)
+	if device != nil {
+		device.NniDhcpTrapVid = of.VlanType(dhcpVid)
+		va.DevicesDisc.Store(id, device)
+	}
+}
diff --git a/internal/pkg/application/igmp.go b/internal/pkg/application/igmp.go
index 2e49a41..a63370d 100644
--- a/internal/pkg/application/igmp.go
+++ b/internal/pkg/application/igmp.go
@@ -1413,7 +1413,7 @@
 	va.delOltFromMvlan(cntx, MvlanProfileID, OltSerialNum)
 	va.deleteMcastConfig(OltSerialNum, MvlanProfileID)
 	_ = db.DelMcastConfig(cntx, McastConfigKey(OltSerialNum, MvlanProfileID))
-	if d := va.GetDeviceBySerialNo(OltSerialNum); d != nil {
+	if d, _ := va.GetDeviceBySerialNo(OltSerialNum); d != nil {
 		if mvp := va.GetMvlanProfileByName(MvlanProfileID); mvp != nil {
 			va.RemoveGroupsFromPendingPool(cntx, d.Name, mvp.Mvlan)
 		}
diff --git a/internal/pkg/application/igmpprofiles.go b/internal/pkg/application/igmpprofiles.go
index 192c8e2..b855eb8 100644
--- a/internal/pkg/application/igmpprofiles.go
+++ b/internal/pkg/application/igmpprofiles.go
@@ -405,7 +405,7 @@
                 return
         }
 
-        d := GetApplication().GetDeviceBySerialNo(OLTSerialNum)
+        d, _ := GetApplication().GetDeviceBySerialNo(OLTSerialNum)
         if d == nil {
                 logger.Warnw(ctx, "Skipping Igmp & Mcast Flow processing: Device Not Found", log.Fields{"Device_SrNo": OLTSerialNum, "Mvlan": mvp.Mvlan})
                 return
@@ -437,7 +437,7 @@
         mvp.mvpLock.RLock()
         defer mvp.mvpLock.RUnlock()
 
-        if d := GetApplication().GetDeviceBySerialNo(oltSerialNum); d != nil {
+        if d, _ := GetApplication().GetDeviceBySerialNo(oltSerialNum); d != nil {
                 p := d.GetPort(d.NniPort)
                 if p != nil {
                         logger.Infow(ctx, "NNI Port Status is: UP", log.Fields{"Device": d, "port": p})
@@ -1028,7 +1028,7 @@
         va := GetApplication()
         logger.Debugw(ctx, "Update of Active Channel Subscriber Alarm", log.Fields{"Mvlan": mvp.Mvlan})
         for srNo := range mvp.DevicesList {
-                d := va.GetDeviceBySerialNo(srNo)
+                d, _ := va.GetDeviceBySerialNo(srNo)
                 if d == nil {
                         logger.Warnw(ctx, "Device info not found", log.Fields{"Device_SrNo": srNo, "Mvlan": mvp.Mvlan})
                         return
diff --git a/internal/pkg/application/service.go b/internal/pkg/application/service.go
index 4ddd45d..9315b5b 100644
--- a/internal/pkg/application/service.go
+++ b/internal/pkg/application/service.go
@@ -71,6 +71,10 @@
 	SVlanTpid                  layers.EthernetType
 	MacAddr                    net.HardwareAddr
 	Pbits                      []of.PbitType
+	UsPonCTagPriority          of.PbitType
+	UsPonSTagPriority          of.PbitType
+	DsPonCTagPriority          of.PbitType
+	DsPonSTagPriority          of.PbitType
 	DsRemarkPbitsMap           map[int]int // Ex: Remark case {0:0,1:0} and No-remark case {1:1}
 	TechProfileID              uint16
 	CircuitID                  string
@@ -99,6 +103,7 @@
 	MaxDataRateDs              uint32
 	IsActivated                bool
 	Trigger                    ServiceTrigger
+	ServiceType                string
 }
 
 // VoltServiceOper structure
@@ -285,6 +290,25 @@
 	}
 }
 
+func (vs *VoltService) AddMeterToDevice(cntx context.Context) error {
+	if vs.DeleteInProgress || vs.UpdateInProgress {
+		logger.Errorw(ctx, "Ignoring Meter Push, Service deleteion In-Progress", log.Fields{"Device": vs.Device, "Service": vs.Name})
+	}
+	va := GetApplication()
+	logger.Infow(ctx, "Configuring Meters for FTTB", log.Fields{"ServiceName": vs.Name})
+	device, err := va.GetDeviceFromPort(vs.Port)
+	if err != nil {
+		logger.Errorw(ctx, "Error Getting Device", log.Fields{"Reason": err.Error()})
+		return errorCodes.ErrDeviceNotFound
+	} else if device.State != controller.DeviceStateUP {
+		logger.Warnw(ctx, "Device state Down. Ignoring Meter Push", log.Fields{"Service": vs.Name, "Port": vs.Port})
+		return nil
+	}
+	va.AddMeterToDevice(vs.Port, device.Name, vs.UsMeterID, 0)
+	va.AddMeterToDevice(vs.Port, device.Name, vs.DsMeterID, vs.AggDsMeterID)
+	return nil
+}
+
 // AddUsHsiaFlows - Add US HSIA Flows for the service
 func (vs *VoltService) AddUsHsiaFlows(cntx context.Context) error {
 
@@ -306,9 +330,11 @@
 		}
 
 		vs.Device = device.Name
-		va.AddMeterToDevice(vs.Port, device.Name, vs.UsMeterID, 0)
-		va.AddMeterToDevice(vs.Port, device.Name, vs.DsMeterID, vs.AggDsMeterID)
-
+		/* In case of DPU_MGMT_TRAFFIC the meters will be configured before US flow creation*/
+		if vs.ServiceType != DPU_MGMT_TRAFFIC {
+			va.AddMeterToDevice(vs.Port, device.Name, vs.UsMeterID, 0)
+			va.AddMeterToDevice(vs.Port, device.Name, vs.DsMeterID, vs.AggDsMeterID)
+		}
 		logger.Infow(ctx, "Adding HSIA flows", log.Fields{"Name": vs.Name})
 		pBits := vs.Pbits
 
@@ -560,7 +586,6 @@
 		if pbits != PbitMatchNone {
 			subflow1.SetMatchPbit(pbits)
 		}
-
 		if remarkExists && (of.PbitType(remarkPbit) != pbits) {
 			subflow1.SetPcp(of.PbitType(remarkPbit))
 			// match & action pbits are different, set remark-pbit action
@@ -703,14 +728,6 @@
 	// PortName and PortID to be used for validation of port before flow pushing
 	flow.PortID = inport
 	flow.PortName = vs.Port
-	allowTransparent := 0
-	reqBwInfo := 0
-	if vs.AllowTransparent {
-		allowTransparent = 1
-	}
-	if vs.BwAvailInfo == "" {
-		reqBwInfo = 1
-	}
 
 	// Add Table-0 flow that deals with the inner VLAN in ONU
 	{
@@ -719,42 +736,24 @@
 		subflow1.SetGoToTable(1)
 		subflow1.SetInPort(inport)
 
+		if vs.ServiceType == DPU_MGMT_TRAFFIC {
+			subflow1.SetMatchPbit(vs.UsPonCTagPriority)
+			subflow1.SetPcp(vs.UsPonSTagPriority)
+		} else if vs.ServiceType == DPU_ANCP_TRAFFIC {
+			subflow1.SetPcp(vs.UsPonSTagPriority)
+		}
 		if err := vs.setUSMatchActionVlanT0(subflow1); err != nil {
 			return nil, err
 		}
 		subflow1.SetMeterID(vs.UsMeterID)
 
-		if GetApplication().GetVendorID() == Radisys {
-			if pbits != PbitMatchNone {
-				subflow1.SetMatchPbit(pbits)
-			}
-			/* WriteMetaData 8 Byte(uint64) usage:
-			| Byte8    | Byte7    | Byte6 | Byte5  | Byte4  | Byte3   | Byte2  | Byte1 |
-			| reserved | reserved | TpID  | TpID   | uinID  | uniID   | uniID  | uniID | */
-			metadata := uint64(vs.CVlan)<<48 + uint64(vs.TechProfileID)<<32 + uint64(outport)
-			subflow1.SetWriteMetadata(metadata)
-			/* TableMetaData 8 Byte(uint64) usage: (Considering MSB bit as 63rd bit and LSB bit as 0th bit)
-			|                         Byte8                     |  Byte7    |  Byte6    |      Byte5       |  Byte4    | Byte3    | Byte2    | Byte1   |
-			| 000      |    0      |    00     |    0     |  0  |  00000000 |  00000000 |  0000   0000     |  00000000 | 00000000 | 00000000 | 00000000|
-			| reserved | reqBwInfo | svlanTpID |  Buff us |  AT |  schedID  |  schedID  | onteth  vlanCtrl |  unitag   | unitag   | ctag     | ctag    | */
-			metadata = uint64(reqBwInfo)<<60 | uint64(allowTransparent)<<56 | uint64(vs.SchedID)<<40 | uint64(vs.ONTEtherTypeClassification)<<36 | uint64(vs.VlanControl)<<32 | uint64(vs.CVlan)
+		/* WriteMetaData 8 Byte(uint64) usage:
+		| Byte8    | Byte7    | Byte6 | Byte5  | Byte4  | Byte3   | Byte2  | Byte1 |
+		| reserved | reserved | TpID  | TpID   | uinID  | uniID   | uniID  | uniID | */
+		//metadata := uint64(vs.CVlan)<<48 + uint64(vs.TechProfileID)<<32 + uint64(outport)
+		metadata := uint64(vs.TechProfileID)<<32 + uint64(outport)
+		subflow1.SetWriteMetadata(metadata)
 
-			// // In case of MAC Learning enabled voltha will buffer the US flow installation.
-			// if NonZeroMacAddress(vs.MacAddr) {
-			// 	subflow1.SetMatchSrcMac(vs.MacAddr)
-			// } else if vs.MacLearning != MacLearning {
-			// 	metadata |= 1 << 57
-			// 	logger.Infow(ctx, "Buffer us flow at adapter", log.Fields{"metadata": metadata})
-			// }
-			subflow1.SetTableMetadata(metadata)
-		} else {
-			/* WriteMetaData 8 Byte(uint64) usage:
-			| Byte8    | Byte7    | Byte6 | Byte5  | Byte4  | Byte3   | Byte2  | Byte1 |
-			| reserved | reserved | TpID  | TpID   | uinID  | uniID   | uniID  | uniID | */
-			//metadata := uint64(vs.CVlan)<<48 + uint64(vs.TechProfileID)<<32 + uint64(outport)
-			metadata := uint64(vs.TechProfileID)<<32 + uint64(outport)
-			subflow1.SetWriteMetadata(metadata)
-		}
 		if vs.VlanControl == OLTCVlanOLTSVlan {
 			/**
 			 * The new cookie generation is only for OLT_CVLAN_OLT_SVLAN case (TEF residential case) within a UNI.
@@ -783,33 +782,17 @@
 		if err := vs.setUSMatchActionVlanT1(subflow2); err != nil {
 			return nil, err
 		}
+		if vs.ServiceType == DPU_MGMT_TRAFFIC {
+			subflow2.SetMatchSrcMac(vs.MacAddr)
+		}
 		subflow2.SetInPort(inport)
 		subflow2.SetOutPort(outport)
 		subflow2.SetMeterID(vs.UsMeterID)
 
-		if GetApplication().GetVendorID() == Radisys {
-			if pbits != PbitMatchNone {
-				subflow2.SetMatchPbit(pbits)
-			}
-			// refer Table-0 flow generation for byte information
-			metadata := uint64(vs.CVlan)<<48 + uint64(vs.TechProfileID)<<32 + uint64(outport)
-			subflow2.SetWriteMetadata(metadata)
-			// refer Table-0 flow generation for byte information
-			metadata = uint64(reqBwInfo)<<60 | uint64(allowTransparent)<<56 | uint64(vs.SchedID)<<40 | uint64(vs.ONTEtherTypeClassification)<<36 | uint64(vs.VlanControl)<<32 | uint64(vs.CVlan)
-			// // In case of MAC Learning enabled voltha will buffer the US flow installation.
-			// if NonZeroMacAddress(vs.MacAddr) {
-			// 	subflow2.SetMatchSrcMac(vs.MacAddr)
-			// } else if vs.MacLearning != MacLearningNone {
-			// 	metadata |= 1 << 57
-			// 	logger.Infow(ctx, "Buffer us flow at adapter", log.Fields{"metadata": metadata})
-			// }
-			subflow2.SetTableMetadata(metadata)
-		} else {
-			// refer Table-0 flow generation for byte information
-			metadata := uint64(vs.TechProfileID)<<32 + uint64(outport)
-			subflow2.SetWriteMetadata(metadata)
+		// refer Table-0 flow generation for byte information
+		metadata := uint64(vs.TechProfileID)<<32 + uint64(outport)
+		subflow2.SetWriteMetadata(metadata)
 
-		}
 		if vs.VlanControl == OLTCVlanOLTSVlan {
 			/**
 			 * The new cookie generation is only for OLT_CVLAN_OLT_SVLAN case (TEF residential case) within a UNI.
@@ -1085,6 +1068,12 @@
 		return errors.New("VNET doesn't exist")
 	}
 
+	// If the device is already discovered, update the device name in service
+	d, err := va.GetDeviceFromPort(vs.Port)
+	if err == nil {
+		vs.Device = d.Name
+	}
+
 	vs.Version = database.PresentVersionMap[database.ServicePath]
 	// Add the service to the volt application
 	va.ServiceByName.Store(vs.Name, vs)
@@ -1588,7 +1577,7 @@
 		return errors.New("New Vnet Id not found")
 	}
 
-	d := va.GetDeviceBySerialNo(serialNum)
+	d, _ := va.GetDeviceBySerialNo(serialNum)
 	if d == nil {
 		logger.Errorw(ctx, "Error Getting Device", log.Fields{"SerialNum": serialNum})
 		return errorCodes.ErrDeviceNotFound
@@ -2064,6 +2053,7 @@
 		vs := value.(*VoltService)
 		// If svlan if provided, then the tags and tpID of service has to be matching
 		if sVlan != of.VlanNone && (sVlan != vs.SVlan || cVlan != vs.CVlan || tpID != vs.TechProfileID) {
+			logger.Infow(ctx, "Service Activate Request Does not match", log.Fields{"Device": deviceID, "voltService": vs})
 			return true
 		}
 		if portNo == vs.Port && !vs.IsActivated {
diff --git a/internal/pkg/application/vnets.go b/internal/pkg/application/vnets.go
index dffbb00..1313490 100644
--- a/internal/pkg/application/vnets.go
+++ b/internal/pkg/application/vnets.go
@@ -44,6 +44,15 @@
 
 	// Radisys vendor id constant
 	Radisys string = "Radisys"
+
+	// DPU_MGMT_TRAFFIC serviceType, vnetType constant
+	DPU_MGMT_TRAFFIC string = "DPU_MGMT_TRAFFIC"
+
+	// DPU_ANCP_TRAFFIC serviceType, vnetType constant
+	DPU_ANCP_TRAFFIC string = "DPU_ANCP_TRAFFIC"
+
+	// FTTB_SUBSCRIBER_TRAFFIC serviceType, vnetType constant
+	FTTB_SUBSCRIBER_TRAFFIC string = "FTTB_SUBSCRIBER_TRAFFIC"
 )
 
 var (
@@ -109,6 +118,11 @@
 	DevicesList                []string //List of serial number of devices on which this vnet is applied
 	AllowTransparent           bool
 	CtrlPktPbitRemark          map[of.PbitType]of.PbitType
+	UsPonCTagPriority          of.PbitType
+	UsPonSTagPriority          of.PbitType
+	DsPonCTagPriority          of.PbitType
+	DsPonSTagPriority          of.PbitType
+	VnetType                   string
 }
 
 // VnetOper structure
@@ -438,6 +452,11 @@
 	DeleteInProgress           bool
 	Blocked                    bool
 	DhcpPbit                   of.PbitType
+	UsPonCTagPriority          of.PbitType
+	UsPonSTagPriority          of.PbitType
+	DsPonCTagPriority          of.PbitType
+	DsPonSTagPriority          of.PbitType
+	VnetType                   string
 }
 
 //VlanControl vlan control type
@@ -490,6 +509,7 @@
 	vpv.MacAddr, _ = net.ParseMAC("00:00:00:00:00:00")
 	vpv.LearntMacAddr, _ = net.ParseMAC("00:00:00:00:00:00")
 	// for OLTCVLAN SVLAN=CVLAN, UNIVLAN can differ.
+	/*
 	if vpv.VlanControl == ONUCVlan {
 		vpv.CVlan = vpv.SVlan
 	}
@@ -497,11 +517,17 @@
 	// hence assigning UNIVLAN to CVLAN, so that ONU will transparently forward the packet.
 	if vpv.VlanControl == OLTSVlan {
 		vpv.CVlan = vpv.UniVlan
-	}
+	}*/
 	vpv.servicesCount = atomic.NewUint64(0)
 	vpv.SchedID = 0
 	vpv.PendingDeleteFlow = make(map[string]bool)
 	vpv.DhcpPbit = vnet.UsDhcpPbit[0]
+	vpv.UsPonCTagPriority = vnet.UsPonCTagPriority
+	vpv.UsPonSTagPriority = vnet.UsPonSTagPriority
+	vpv.DsPonCTagPriority = vnet.UsPonCTagPriority
+	vpv.DsPonSTagPriority = vnet.UsPonSTagPriority
+
+	vpv.VnetType = vnet.VnetType
 	return &vpv
 }
 
@@ -766,17 +792,24 @@
 		// If MAC Learning is true if no MAC is configured, push DS/US DHCP, US HSIA flows without MAC.
 		// DS HSIA flows are installed after learning the MAC.
 		logger.Infow(ctx, "Port Up - Trap Flows", log.Fields{"Device": device.Name, "Port": port})
-		// no HSIA flows for multicast service
-		if !vpv.McastService {
+		// no HSIA flows for multicast service and DPU_MGMT Service
+		if !vpv.McastService && vpv.VnetType != DPU_MGMT_TRAFFIC {
 			vpv.RangeOnServices(cntx, AddUsHsiaFlows)
 		}
+		if vpv.VnetType == DPU_MGMT_TRAFFIC {
+			vpv.RangeOnServices(cntx, AddMeterToDevice)
+		}
 		vpv.AddTrapFlows(cntx)
 		if vpv.MacLearning == MacLearningNone || NonZeroMacAddress(vpv.MacAddr) {
 			logger.Infow(ctx, "Port Up - DS Flows", log.Fields{"Device": device.Name, "Port": port})
+			/*In case of DPU_MGMT_TRAFFIC, need to install both US and DS traffic */
+			if  vpv.VnetType == DPU_MGMT_TRAFFIC {
+				vpv.RangeOnServices(cntx, AddUsHsiaFlows)
+			}
 			// US & DS DHCP, US HSIA flows are already installed
 			// install only DS HSIA flow here.
 			// no HSIA flows for multicast service
-			if !vpv.McastService {
+			if !vpv.McastService  {
 				vpv.RangeOnServices(cntx, AddDsHsiaFlows)
 			}
 		}
@@ -889,6 +922,10 @@
 	}
 	// Ds Hsia flows has to be pushed
 	if vpv.FlowsApplied {
+		// In case of DPU_MGMT_TRAFFIC install both US and DS Flows
+		if vpv.VnetType == DPU_MGMT_TRAFFIC {
+			vpv.RangeOnServices(cntx, AddUsHsiaFlows)
+		}
 		// no HSIA flows for multicast service
 		if !vpv.McastService {
 			vpv.RangeOnServices(cntx, AddDsHsiaFlows)
@@ -1002,6 +1039,8 @@
 	logger.Debugw(ctx, "Added MAC to VPV", log.Fields{"MacLearning": vpv.MacLearning, "VPV": vpv})
 	//Reconfigure Vlans based on Vlan Control type
 	svc.VlanControl = vpv.VlanControl
+	//TODO Is it good to change NB config?? commenting for now
+	/*
 	// for OLTCVLAN SVLAN=CVLAN, UNIVLAN can differ.
 	if vpv.VlanControl == ONUCVlan {
 		svc.CVlan = svc.SVlan
@@ -1010,7 +1049,7 @@
 	// hence assigning UNIVLAN to CVLAN, so that ONU will transparently forward the packet.
 	if vpv.VlanControl == OLTSVlan {
 		svc.CVlan = svc.UniVlan
-	}
+	}*/
 	if svc.McastService {
 		vpv.McastService = true
 		vpv.McastTechProfileID = svc.TechProfileID
@@ -1172,6 +1211,15 @@
 	return true
 }
 
+// AddMeterToDevice to add meter config to device, used in FTTB case
+func AddMeterToDevice(cntx context.Context, key, value interface{}) bool {
+	svc := value.(*VoltService)
+	if err:= svc.AddMeterToDevice(cntx); err != nil {
+		logger.Warnw(ctx, "Add Meter failed", log.Fields{"service": svc.Name, "Error": err})
+	}
+	return true
+}
+
 //AddTrapFlows - Adds US & DS Trap flows
 func (vpv *VoltPortVnet) AddTrapFlows(cntx context.Context) {
 
@@ -1331,7 +1379,8 @@
 		logger.Errorw(ctx, "DS DHCP Flow Push Failed- Device not found", log.Fields{"Port": vpv.Port, "SVLAN": vpv.SVlan, "CVLAN": vpv.CVlan, "UNIVlan": vpv.UniVlan, "device": device})
 		return errorCodes.ErrDeviceNotFound
 	}
-	if GetApplication().GetVendorID() != Radisys && vd.GlobalDhcpFlowAdded {
+	if vd.GlobalDhcpFlowAdded {
+		logger.Info(ctx, "Global Dhcp flow already exists")
 		return nil
 	}
 
@@ -1685,17 +1734,20 @@
 	subFlow := of.NewVoltSubFlow()
 	subFlow.SetTableID(0)
 
-	if GetApplication().GetVendorID() == Radisys {
-		if err := vpv.setUsMatchVlan(subFlow); err != nil {
-			return nil, err
-		}
+
+	if vpv.VnetType == DPU_MGMT_TRAFFIC {
+		subFlow.SetMatchVlan(vpv.CVlan)
+		subFlow.SetMatchPbit(vpv.UsPonCTagPriority)
+		subFlow.SetPcp(vpv.UsPonSTagPriority)
+		subFlow.SetSetVlan(vpv.SVlan)
 	} else {
 		subFlow.SetMatchVlan(vpv.UniVlan)
 		subFlow.SetSetVlan(vpv.CVlan)
+		subFlow.SetPcp(vpv.DhcpPbit)
 	}
 	subFlow.SetUdpv4Match()
-	subFlow.SrcPort = 68
 	subFlow.DstPort = 67
+	subFlow.SrcPort = 68
 	uniport, err := GetApplication().GetPortID(vpv.Port)
 	if err != nil {
 		logger.Errorw(ctx, "Failed to fetch uni port from vpv", log.Fields{"error": err, "port": vpv.Port})
@@ -1709,23 +1761,28 @@
 
 	// Set techprofile, meterid of first service
 	vpv.services.Range(func(key, value interface{}) bool {
-		svc := value.(*VoltService)
-		writemetadata := uint64(svc.TechProfileID) << 32
+		vs := value.(*VoltService)
+		var writemetadata uint64
+		if vpv.VnetType == DPU_MGMT_TRAFFIC {
+			writemetadata = uint64(vs.SVlan)<<48 + uint64(vs.TechProfileID)<<32
+		} else {
+			writemetadata = uint64(vs.TechProfileID) << 32
+		}
 		subFlow.SetWriteMetadata(writemetadata)
-		subFlow.SetMeterID(svc.UsMeterID)
+		subFlow.SetMeterID(vs.UsMeterID)
 		return false
 	})
 
-	subFlow.SetPcp(vpv.DhcpPbit)
 	// metadata := uint64(uniport)
 	// subFlow.SetWriteMetadata(metadata)
 	allowTransparent := 0
 	if vpv.AllowTransparent {
 		allowTransparent = 1
 	}
-	metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
-	subFlow.SetTableMetadata(metadata)
-
+	if vpv.VnetType != DPU_MGMT_TRAFFIC {
+		metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
+		subFlow.SetTableMetadata(metadata)
+	}
 	//| 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
 	subFlow.Cookie = uint64(vpv.CVlan)<<52 | uint64(uniport)<<16 | of.DhcpArpFlowMask | of.UsFlowMask
 	subFlow.Priority = of.DhcpFlowPriority
@@ -1743,9 +1800,9 @@
 	flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
 	subFlow := of.NewVoltSubFlow()
 	subFlow.SetTableID(0)
-	// If dhcp trap rule is global rule, No need to match on vlan
-	if GetApplication().GetVendorID() == Radisys {
-		vpv.setDsMatchVlan(subFlow)
+	// match on vlan only for fttb case
+	if vpv.VnetType == DPU_MGMT_TRAFFIC {
+		subFlow.SetMatchVlan(vpv.SVlan)
 	}
 	subFlow.SetUdpv4Match()
 	subFlow.SrcPort = 67
@@ -1769,12 +1826,14 @@
 	if vpv.AllowTransparent {
 		allowTransparent = 1
 	}
-	metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
-	subFlow.SetTableMetadata(metadata)
+	if vpv.VnetType != DPU_MGMT_TRAFFIC {
+		metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
+		subFlow.SetTableMetadata(metadata)
+		subFlow.Priority = of.DhcpFlowPriority
+	}
 	subFlow.SetReportToController()
 	//| 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
 	subFlow.Cookie = uint64(vpv.CVlan)<<52 | uint64(uniport)<<16 | of.DhcpArpFlowMask | of.DsFlowMask
-	subFlow.Priority = of.DhcpFlowPriority
 
 	flow.SubFlows[subFlow.Cookie] = subFlow
 	logger.Infow(ctx, "Built DS DHCP flow ", log.Fields{"cookie": subFlow.Cookie, "Flow": flow})
diff --git a/voltha-go-controller/nbi/sadissubscriber.go b/voltha-go-controller/nbi/subscriber.go
similarity index 81%
rename from voltha-go-controller/nbi/sadissubscriber.go
rename to voltha-go-controller/nbi/subscriber.go
index 0bfe39c..dca6fa2 100644
--- a/voltha-go-controller/nbi/sadissubscriber.go
+++ b/voltha-go-controller/nbi/subscriber.go
@@ -42,6 +42,7 @@
 	NasID              string              `json:"nasId"`
 	CircuitID          string              `json:"circuitId"`
 	RemoteID           string              `json:"remoteId"`
+	NniDhcpTrapVid     int                 `json:"nniDhcpTrapVid"`
 	UniTagList         []UniTagInformation `json:"uniTagList"`
 }
 
@@ -121,7 +122,12 @@
 func addAllService(cntx context.Context, srvInfo *SubscriberDeviceInfo) {
 
 	//vsCfgList := getVoltServiceFromSrvInfo(srvInfo)
-
+	va := app.GetApplication()
+	if len(srvInfo.UniTagList) == 0 {
+		logger.Debugw(ctx, "Received OLT configuration", log.Fields{"req": srvInfo})
+		va.UpdateDeviceConfig(cntx, srvInfo.ID, srvInfo.HardwareIdentifier, srvInfo.NasID, srvInfo.UplinkPort, srvInfo.NniDhcpTrapVid, srvInfo.IPAddress)
+		return
+	}
 	for _, uniTagInfo := range srvInfo.UniTagList {
 		var vs application.VoltServiceCfg
 
@@ -136,14 +142,22 @@
 		vs.SVlan = of.VlanType(uniTagInfo.PonSTag)
 		vs.CVlan = of.VlanType(uniTagInfo.PonCTag)
 		vs.UniVlan = of.VlanType(uniTagInfo.UniTagMatch)
+		vs.UsPonCTagPriority = of.PbitType(uniTagInfo.UsPonCTagPriority)
+		vs.UsPonSTagPriority = of.PbitType(uniTagInfo.UsPonSTagPriority)
+		vs.DsPonCTagPriority = of.PbitType(uniTagInfo.UsPonCTagPriority)
+		vs.DsPonSTagPriority = of.PbitType(uniTagInfo.UsPonSTagPriority)
 		vs.TechProfileID = uint16(uniTagInfo.TechnologyProfileID)
 		vs.UsMeterProfile = uniTagInfo.UpstreamBandwidthProfile
 		vs.DsMeterProfile = uniTagInfo.DownstreamBandwidthProfile
 		vs.IgmpEnabled = uniTagInfo.IsIgmpRequired
-		//vs.McastService = uniTagInfo.IsIgmpRequired
-		if vs.IgmpEnabled {
-			vs.MvlanProfileName = "mvlan" + strconv.Itoa(uniTagInfo.PonSTag)
-		}
+		vs.ServiceType = uniTagInfo.ServiceName
+
+		if uniTagInfo.ServiceName == app.DPU_MGMT_TRAFFIC ||
+		   uniTagInfo.ServiceName == app.DPU_ANCP_TRAFFIC ||
+		   uniTagInfo.ServiceName == app.FTTB_SUBSCRIBER_TRAFFIC {
+			vs.UniVlan = vs.CVlan
+			vs.Pbits = append(vs.Pbits, of.PbitMatchAll)
+		} else {
 		if uniTagInfo.UsPonSTagPriority == -1 {
 			vs.Pbits = append(vs.Pbits, of.PbitMatchAll)
 		// Process the p-bits received in the request
@@ -156,7 +170,11 @@
 				vs.Pbits = append(vs.Pbits, of.PbitType(uniTagInfo.DsPonCTagPriority))
 			}
 		}
-
+		}
+		//vs.McastService = uniTagInfo.IsIgmpRequired
+		if vs.IgmpEnabled {
+			vs.MvlanProfileName = "mvlan" + strconv.Itoa(uniTagInfo.PonSTag)
+		}
 		/*
 		var err error
 		if vs.MacAddr, err = net.ParseMAC(srvInfo.HardwareIdentifier); err != nil {
@@ -173,22 +191,35 @@
 		vnetName = vnetName + strconv.FormatUint(uint64(vs.UniVlan), 10)
 
 		vnetcfg := app.VnetConfig{
-			Name:       vnetName,
-			SVlan:      vs.SVlan,
-			CVlan:      vs.CVlan,
-			UniVlan:    vs.UniVlan,
-			SVlanTpid:  layers.EthernetTypeDot1Q,
-			DhcpRelay:  uniTagInfo.IsDhcpRequired,
-			//MacLearning:                req.MacLearning,
+			Name:              vnetName,
+			SVlan:             vs.SVlan,
+			CVlan:             vs.CVlan,
+			UniVlan:           vs.UniVlan,
+			SVlanTpid:         layers.EthernetTypeDot1Q,
+			DhcpRelay:         uniTagInfo.IsDhcpRequired,
+			VnetType:          uniTagInfo.ServiceName,
+			UsPonCTagPriority: vs.UsPonCTagPriority,
+			UsPonSTagPriority: vs.UsPonSTagPriority,
+			DsPonCTagPriority: vs.UsPonCTagPriority,
+			DsPonSTagPriority: vs.UsPonSTagPriority,
 			//ONTEtherTypeClassification: req.ONTEtherTypeClassification,
 			//VlanControl:                app.VlanControl(req.VlanControl), //TODO
 		}
+		if uniTagInfo.EnableMacLearning {
+			vnetcfg.MacLearning = app.Learn
+		}
 		if uniTagInfo.UsPonSTagPriority < 8 {
 			vnetcfg.UsDhcpPbit = append(vnetcfg.UsDhcpPbit, of.PbitType(uniTagInfo.UsPonSTagPriority))
 		}
-
 		if vs.CVlan != of.VlanAny && vs.SVlan != of.VlanAny {
-			vnetcfg.VlanControl = app.ONUCVlanOLTSVlan
+			if uniTagInfo.ServiceName == app.DPU_MGMT_TRAFFIC ||
+			   uniTagInfo.ServiceName == app.DPU_ANCP_TRAFFIC {
+				vnetcfg.VlanControl = app.ONUCVlan
+			} else if uniTagInfo.ServiceName == app.FTTB_SUBSCRIBER_TRAFFIC {
+				vnetcfg.VlanControl = app.OLTSVlan
+			} else {
+				vnetcfg.VlanControl = app.ONUCVlanOLTSVlan
+			}
 		} else if vs.CVlan == of.VlanAny && vs.UniVlan == of.VlanAny {
 			vnetcfg.VlanControl = app.OLTSVlan
 		}
