diff --git a/internal/pkg/application/application.go b/internal/pkg/application/application.go
index 04f4a6a..fa9e649 100644
--- a/internal/pkg/application/application.go
+++ b/internal/pkg/application/application.go
@@ -328,6 +328,19 @@
 	return nil
 }
 
+// GetPortByPortID to get port information from the device.
+func (d *VoltDevice) GetPortNameFromPortID(portID uint32) string {
+	portName := ""
+	d.Ports.Range(func(key, value interface{}) bool {
+		vp := value.(*VoltPort)
+		if vp.ID == portID {
+			portName = vp.Name
+		}
+		return true
+	})
+	return portName
+}
+
 // DelPort to delete port from the device
 func (d *VoltDevice) DelPort(port string) {
 	if _, ok := d.Ports.Load(port); ok {
@@ -429,6 +442,7 @@
 	VoltPortVnetsToDelete     map[*VoltPortVnet]bool
 	PortAlarmProfileCache     map[string]map[string]int // [portAlarmID][ThresholdLevelString]ThresholdLevel
 	vendorID                  string
+	OltFlowServiceConfig      OltFlowService
 }
 
 // PonPortCfg contains NB port config and activeIGMPChannels count
@@ -681,6 +695,8 @@
 	va.RestoreIgmpGroupsFromDb(cntx)
 	logger.Info(ctx, "Reading Upgrade status from DB")
 	va.RestoreUpgradeStatus(cntx)
+	logger.Info(ctx, "Reading OltFlowService from DB")
+	va.RestoreOltFlowService(cntx)
 	logger.Info(ctx, "Reconciled from DB")
 }
 
@@ -815,6 +831,19 @@
 			logger.Infow(ctx, "Port state is UP. Trigerring Port Down Ind before deleting", log.Fields{"Port": p})
 			va.PortDownInd(cntx, device, port)
 		}
+		// if RemoveFlowsOnDisable is flase, then flows will be existing till port delete. Remove the flows now
+		if !va.OltFlowServiceConfig.RemoveFlowsOnDisable {
+		        vpvs, ok := va.VnetsByPort.Load(port)
+		        if !ok || nil == vpvs || len(vpvs.([]*VoltPortVnet)) == 0 {
+				logger.Infow(ctx, "No VNETs on port", log.Fields{"Device": device, "Port": port})
+			} else {
+				for _, vpv := range vpvs.([]*VoltPortVnet) {
+					vpv.VpvLock.Lock()
+					vpv.PortDownInd(cntx, device, port, true)
+					vpv.VpvLock.Unlock()
+				}
+			}
+		}
 		va.portLock.Lock()
 		defer va.portLock.Unlock()
 		d.DelPort(port)
@@ -1264,7 +1293,7 @@
 		for _, vpv := range vpvs.([]*VoltPortVnet) {
 			vpv.VpvLock.Lock()
 			logger.Warnw(ctx, "Removing existing VPVs/Services flows for for Subscriber: UNI Detected on wrong PON", log.Fields{"Port": vpv.Port, "Vnet": vpv.VnetName})
-			vpv.PortDownInd(cntx, device, port)
+			vpv.PortDownInd(cntx, device, port, false)
 			if vpv.IgmpEnabled {
 				va.ReceiverDownInd(cntx, device, port)
 			}
@@ -1395,7 +1424,7 @@
 */
 	for _, vpv := range vpvs.([]*VoltPortVnet) {
 		vpv.VpvLock.Lock()
-		vpv.PortDownInd(cntx, device, port)
+		vpv.PortDownInd(cntx, device, port, false)
 		if vpv.IgmpEnabled {
 			va.ReceiverDownInd(cntx, device, port)
 		}
@@ -2060,3 +2089,38 @@
 		}
 	}
 }
+
+type OltFlowService struct {
+        EnableDhcpOnNni      bool `json:"enableDhcpOnNni"`
+        DefaultTechProfileId int  `json:"defaultTechProfileId"`
+        EnableIgmpOnNni      bool `json:"enableIgmpOnNni"`
+        EnableEapol          bool `json:"enableEapol"`
+        EnableDhcpV6         bool `json:"enableDhcpV6"`
+        EnableDhcpV4         bool `json:"enableDhcpV4"`
+        RemoveFlowsOnDisable bool `json:"removeFlowsOnDisable"`
+}
+
+func (va *VoltApplication) UpdateOltFlowService(cntx context.Context, oltFlowService OltFlowService) {
+	logger.Infow(ctx, "UpdateOltFlowService", log.Fields{"oldValue": va.OltFlowServiceConfig, "newValue": oltFlowService})
+	va.OltFlowServiceConfig = oltFlowService
+	b, err := json.Marshal(va.OltFlowServiceConfig)
+	if err != nil {
+		logger.Warnw(ctx, "Failed to Marshal OltFlowServiceConfig", log.Fields{"OltFlowServiceConfig": va.OltFlowServiceConfig})
+		return
+	}
+	_ = db.PutOltFlowService(cntx, string(b))
+}
+// RestoreOltFlowService to read from the DB and restore olt flow service config
+func (va *VoltApplication) RestoreOltFlowService(cntx context.Context) {
+	oltflowService, err := db.GetOltFlowService(cntx)
+	if err != nil {
+		logger.Warnw(ctx, "Failed to Get OltFlowServiceConfig from DB", log.Fields{"Error": err})
+		return
+	}
+	err = json.Unmarshal([]byte(oltflowService), &va.OltFlowServiceConfig)
+	if err != nil {
+		logger.Warn(ctx, "Unmarshal of oltflowService failed")
+		return
+	}
+	logger.Infow(ctx, "updated OltFlowServiceConfig from DB", log.Fields{"OltFlowServiceConfig": va.OltFlowServiceConfig})
+}
diff --git a/internal/pkg/application/service.go b/internal/pkg/application/service.go
index d710298..4ddd45d 100644
--- a/internal/pkg/application/service.go
+++ b/internal/pkg/application/service.go
@@ -2094,18 +2094,6 @@
 // DeactivateService to activate pre-provisioned service
 func (va *VoltApplication) DeactivateService(cntx context.Context, deviceID, portNo string, sVlan, cVlan of.VlanType, tpID uint16) error {
 	logger.Infow(ctx, "Service Deactivate Request ", log.Fields{"Device": deviceID, "Port": portNo})
-	device, err := va.GetDeviceFromPort(portNo)
-	if err != nil {
-		logger.Errorw(ctx, "Error Getting Device", log.Fields{"Reason": err.Error(), "Port": portNo})
-		return errorCodes.ErrPortNotFound
-	}
-	// If device id is not provided check only port number
-	if deviceID == DeviceAny {
-		deviceID = device.Name
-	} else if deviceID != device.Name {
-		logger.Errorw(ctx, "Wrong Device ID in request", log.Fields{"Device": deviceID, "Port": portNo})
-		return errorCodes.ErrDeviceNotFound
-	}
 	va.ServiceByName.Range(func(key, value interface{}) bool {
 		vs := value.(*VoltService)
 		// If svlan if provided, then the tags and tpID of service has to be matching
@@ -2118,11 +2106,18 @@
 			vs.IsActivated = false
 			va.ServiceByName.Store(vs.Name, vs)
 			vs.WriteToDb(cntx)
+			device, err := va.GetDeviceFromPort(portNo)
+			if err != nil {
+				// Even if the port/device does not exists at this point in time, the deactivate request is succss.
+				// So no error is returned
+				logger.Infow(ctx, "Error Getting Device", log.Fields{"Reason": err.Error(), "Port": portNo})
+				return true
+			}
 			p := device.GetPort(vs.Port)
-			if p != nil && p.State == PortStateUp {
+			if p != nil && (p.State == PortStateUp || !va.OltFlowServiceConfig.RemoveFlowsOnDisable){
 				if vpv := va.GetVnetByPort(vs.Port, vs.SVlan, vs.CVlan, vs.UniVlan); vpv != nil {
 					// Port down call internally deletes all the flows
-					vpv.PortDownInd(cntx, deviceID, portNo)
+					vpv.PortDownInd(cntx, deviceID, portNo, true)
 					if vpv.IgmpEnabled {
 						va.ReceiverDownInd(cntx, deviceID, portNo)
 					}
@@ -2135,6 +2130,7 @@
 	})
 	return nil
 }
+
 /* GetServicePbit to get first set bit in the pbit map
    returns -1 : If configured to match on all pbits
    returns 8  : If no pbits are configured
diff --git a/internal/pkg/application/vnets.go b/internal/pkg/application/vnets.go
index 85de6dc..dffbb00 100644
--- a/internal/pkg/application/vnets.go
+++ b/internal/pkg/application/vnets.go
@@ -817,8 +817,12 @@
 // PortDownInd : When the port status changes to down, we delete all configured flows
 // The same indication is also passed to the services enqueued for them
 // to take appropriate actions
-func (vpv *VoltPortVnet) PortDownInd(cntx context.Context, device string, port string) {
+func (vpv *VoltPortVnet) PortDownInd(cntx context.Context, device string, port string, nbRequest bool) {
 
+	if !nbRequest && !GetApplication().OltFlowServiceConfig.RemoveFlowsOnDisable {
+		logger.Info(ctx, "VPV Port DOWN Ind, Not deleting flows since RemoveOnDisable is disabled")
+		return
+	}
 	logger.Infow(ctx, "VPV Port DOWN Ind, deleting all flows for services",
 		log.Fields{"service count": vpv.servicesCount.Load()})
 
