import {CheckboxFormControl} from "../../../../models/formControlModels/checkboxFormControl.model";
 import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
 import {NodeModel} from "../../../../models/nodeModel";
+import {LcpRegion} from "../../../../models/lcpRegion";
+import {Tenant} from "../../../../models/tenant";
 
 @Injectable()
 export class SharedControllersService {
 
 
   getLineOfBusinessControl = (instance?: any): DropdownFormControl => {
+    return this.getLineOfBusinessControlInternal(undefined, instance);
+  };
+
+  getLineOfBusinessByOwningEntityControl = (instance?: any, serviceId?: string, controls?: FormControlModel[]): DropdownFormControl => {
+    const service = this._store.getState().service.serviceInstance[serviceId];
+    const owningEntityName: string = service.owningEntityName;
+
+    const changeLcpRegionOptionsOnChange = (lineOfBusinessNameParam: string, form: FormGroup) => {
+      form.controls['lcpCloudRegionId'].enable();
+      form.controls['lcpCloudRegionId'].reset();
+      this._basicControlGenerator.getSubscribeInitResult(
+        this._aaiService.getLcpRegionsByOwningEntityAndLineOfBusiness.bind(this, owningEntityName, lineOfBusinessNameParam),
+        controls.find(item => item.controlName === 'lcpCloudRegionId') as DropdownFormControl, form
+      ).subscribe()
+    };
+
+    return this.getLineOfBusinessControlInternal(changeLcpRegionOptionsOnChange, instance);
+  };
+
+  private getLineOfBusinessControlInternal = (onChange: Function, instance?: any): DropdownFormControl => {
     return new DropdownFormControl({
       type: FormControlType.DROPDOWN,
       controlName: 'lineOfBusiness',
       value: instance ? instance.lineOfBusiness : null,
       validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
       onInitSelectedField: ['lineOfBusinessList'],
+      onChange,
       onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
     })
   };
     const service = this._store.getState().service.serviceInstance[serviceId];
     const globalCustomerId: string = service.globalSubscriberId;
     const serviceType: string = service.subscriptionServiceType;
+
+    const onInit = instance
+      ? this._basicControlGenerator.getSubscribeInitResult.bind(
+          this._aaiService,
+          this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType))
+      : () => {};
+    return this.getTenantControlInternal(onInit, instance);
+  };
+
+  getTenantByLcpRegionControl = (serviceId: string, instance?: any): DropdownFormControl => {
+    return this.getTenantControlInternal(() => {}, instance);
+  };
+
+  private getTenantControlInternal = (onInit: Function, instance?: any): DropdownFormControl => {
     return new DropdownFormControl({
       type: FormControlType.DROPDOWN,
       controlName: 'tenantId',
       onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null,
       value: instance ? instance.tenantId : null,
       validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
-      onInit: instance ? this._basicControlGenerator.getSubscribeInitResult.bind(
-        this._aaiService,
-        this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : () => {
-      }
+      onInit,
     })
   };
 
     const service = this._store.getState().service.serviceInstance[serviceId];
     const globalCustomerId: string = service.globalSubscriberId;
     const serviceType: string = service.subscriptionServiceType;
+
+    const onInit = this._basicControlGenerator.getSubscribeInitResult.bind(
+      this._aaiService,
+      this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)
+    );
+
+    const changeTenantsOptionsByServiceTypeOnChange = (
+      (globalCustomerId, serviceType, lcpCloudRegionIdParam) => {
+        if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
+          this._basicControlGenerator.getSubscribeResult.bind(this,
+            this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType)
+            .subscribe(res => this.setTenantsOptions(controls, res.lcpRegionsTenantsMap[lcpCloudRegionIdParam])));
+        }
+
+      }
+    ).bind(this, globalCustomerId, serviceType);
+
+    return this.getLcpRegionControlInternal(instance, controls,
+      false, onInit, ['lcpRegionList'], changeTenantsOptionsByServiceTypeOnChange)
+  };
+
+  getLcpRegionByLineOfBusinessControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    const service = this._store.getState().service.serviceInstance[serviceId];
+    const owningEntityName: string = service.owningEntityName;
+
+    const changeTenantsOptions = (controls: FormControlModel[], cloudRegionId, lcpRegionList: LcpRegion[]) => {
+      const lcpRegionOption = (_.isNil(lcpRegionList) || _.isNil(cloudRegionId))
+        ? null : lcpRegionList.find(({id}) => id === cloudRegionId);
+
+      if (!_.isNil(lcpRegionOption)) {
+        this._aaiService.getTenantsByCloudOwnerAndCloudRegionId(lcpRegionOption.cloudOwner, lcpRegionOption.id)
+          .subscribe(res => this.setTenantsOptions(controls, res));
+      }
+    };
+
+    const lcpRegionOptionsList = (controls: FormControlModel[]): LcpRegion[] => {
+      const lcpCloudRegionIdControl = _.isNil(controls)
+        ? null : controls.find(({controlName}) => controlName === 'lcpCloudRegionId');
+
+      return _.isNil(lcpCloudRegionIdControl) ? null : lcpCloudRegionIdControl['options$'];
+    };
+
+    const loadLcpRegionOptionsOnInit = (_.isNil(instance) || _.isNil(instance.lineOfBusiness))
+      ? () => {}
+      : this._basicControlGenerator.getSubscribeInitResult.bind(
+        this, () => {
+          return this._aaiService.getLcpRegionsByOwningEntityAndLineOfBusiness(owningEntityName, instance.lineOfBusiness)
+          .do(res => changeTenantsOptions(controls, instance.lcpCloudRegionId, res));
+        }
+      );
+
+    const changeTenantsOptionsByCloudRegionIdOnChange = (
+      (controls, lcpCloudRegionIdParam) => changeTenantsOptions(controls, lcpCloudRegionIdParam, lcpRegionOptionsList(controls))
+    ).bind(this, controls);
+
+    return this.getLcpRegionControlInternal(instance, controls,
+      _.isNil(instance) || _.isNil(instance.lineOfBusiness),
+      loadLcpRegionOptionsOnInit, null, changeTenantsOptionsByCloudRegionIdOnChange
+      )
+  };
+
+  private getLcpRegionControlInternal = (instance: any, controls: FormControlModel[], isDisabled: boolean,
+                                         onInit: Function, onInitSelectedField: string[], changeTenantsOptionsOnChange: Function
+  ): DropdownFormControl => {
     return new DropdownFormControl({
       type: FormControlType.DROPDOWN,
       controlName: 'lcpCloudRegionId',
       dataTestId: 'lcpRegion',
       placeHolder: 'Select LCP Region',
       name: "lcpRegion",
-      isDisabled: false,
+      isDisabled,
       value: instance ? instance.lcpCloudRegionId : null,
       validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
-      onInitSelectedField: ['lcpRegionList'],
-      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(
-        this._aaiService,
-        this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)),
-      onChange: (param: string, form: FormGroup) => {
+      onInitSelectedField,
+      onInit,
+
+      onChange: (lcpCloudRegionIdParam: string, form: FormGroup) => {
         form.controls['tenantId'].enable();
         form.controls['tenantId'].reset();
-        if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
-          this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => {
-            controls.find(item => item.controlName === 'tenantId')['options$'] = res.lcpRegionsTenantsMap[param];
-            if (res.lcpRegionsTenantsMap[param]) {
-              controls.find(item => item.controlName === 'tenantId')['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0;
-            }
-          }));
-        }
 
-        if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) {
+        changeTenantsOptionsOnChange(lcpCloudRegionIdParam);
+
+        if (Constants.LegacyRegion.MEGA_REGION.indexOf(lcpCloudRegionIdParam) !== -1) {
           form.controls['legacyRegion'].enable();
           controls.find(item => item.controlName === 'legacyRegion').isVisible = true;
 
     })
   };
 
+  private setTenantsOptions = (controls: FormControlModel[], tenants: Tenant[]) => {
+    const tenantsControl = controls.find(item => item.controlName === 'tenantId');
+    tenantsControl['options$'] = tenants;
+    tenantsControl['hasEmptyOptions'] = tenants && tenants.length === 0;
+  };
+
   getSDNCControl = (instance: any, extraContents? : object[]): FormControlModel => {
     return new CheckboxFormControl({
       controlName: SDN_C_PRE_LOAD,
 
 import {NgRedux} from "@angular-redux/store";
 import {HttpClient} from "@angular/common/http";
 import {ControlGeneratorUtil} from "../control.generator.util.service";
-import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
 import {LogService} from "../../../../utils/log/log.service";
 import {VNFModel} from "../../../../models/vnfModel";
 import {AppState} from "../../../../store/reducers";
 import {MultiselectFormControl} from "../../../../models/formControlModels/multiselectFormControl.model";
 import {MultiSelectItem} from "../../../formControls/component/multiselect/multiselect.model";
 import {SharedControllersService} from "../sharedControlles/shared.controllers.service";
+import {FeatureFlagsService, Features} from "../../../../services/featureFlag/feature-flags.service";
 
 @Injectable()
 export class VnfControlGenerator {
   constructor(private genericFormService: GenericFormService,
               private _basicControlGenerator: ControlGeneratorUtil,
               private _sharedControllersService : SharedControllersService,
+              private _featureFlagsService: FeatureFlagsService,
               private store: NgRedux<AppState>,
               private http: HttpClient,
               private _aaiService: AaiService,
     const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]);
 
     if (!_.isNil(vnfModel)) {
-      const flags = this.store.getState().global.flags;
+      const isMultiSelected =
+        this._featureFlagsService.getFlagState(Features.FLAG_2002_VNF_PLATFORM_MULTI_SELECT);
+      const lcpRegionsByLineOFBusiness =
+        this._featureFlagsService.getFlagState(Features.FLAG_2006_LCP_REGIONS_BY_LINE_OF_BUSINESS);
+
       result.push(this.getInstanceName(vnfInstance, serviceId, vnfName, vnfModel.isEcompGeneratedNaming));
       result.push(this._sharedControllersService.getProductFamilyControl(vnfInstance, result, true));
-      result.push(this._sharedControllersService.getLcpRegionControl(serviceId, vnfInstance, result));
-      result.push(this._sharedControllersService.getLegacyRegion(vnfInstance));
-      result.push(this._sharedControllersService.getTenantControl(serviceId, vnfInstance));
-      result.push(this.getPlatformMultiselectControl(vnfInstance, result, flags['FLAG_2002_VNF_PLATFORM_MULTI_SELECT']));
-      result.push(this._sharedControllersService.getLineOfBusinessControl(vnfInstance));
+
+      if (lcpRegionsByLineOFBusiness) {
+        result.push(this._sharedControllersService.getLineOfBusinessByOwningEntityControl(vnfInstance, serviceId, result));
+        result.push(this._sharedControllersService.getLcpRegionByLineOfBusinessControl(serviceId, vnfInstance, result));
+        result.push(this._sharedControllersService.getLegacyRegion(vnfInstance));
+        result.push(this._sharedControllersService.getTenantByLcpRegionControl(serviceId, vnfInstance));
+        result.push(this.getPlatformMultiselectControl(vnfInstance, result, isMultiSelected));
+      } else {
+        result.push(this._sharedControllersService.getLcpRegionControl(serviceId, vnfInstance, result));
+        result.push(this._sharedControllersService.getLegacyRegion(vnfInstance));
+        result.push(this._sharedControllersService.getTenantControl(serviceId, vnfInstance));
+        result.push(this.getPlatformMultiselectControl(vnfInstance, result, isMultiSelected));
+        result.push(this._sharedControllersService.getLineOfBusinessControl(vnfInstance));
+      }
+
       result.push(this._sharedControllersService.getRollbackOnFailureControl(vnfInstance));
     }
     return result;
 
 import {VfModuleInstance} from "../../models/vfModuleInstance";
 import {ServiceInstance} from "../../models/serviceInstance";
 import {VfModuleMap} from "../../models/vfModulesMap";
-import {updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateServiceTypes, updateSubscribers, updateUserId} from "../../storeUtil/utils/general/general.actions";
+import {
+  updateAicZones,
+  updateCategoryParameters,
+  updateLcpRegionsAndTenants,
+  updateServiceTypes,
+  updateSubscribers,
+  updateUserId
+} from "../../storeUtil/utils/general/general.actions";
 import {createServiceInstance, updateModel,} from "../../storeUtil/utils/service/service.actions";
 import {FeatureFlagsService, Features} from "../featureFlag/feature-flags.service";
 import {VnfMember} from "../../models/VnfMember";
       cloudRegionId+AaiService.formatCloudOwnerTrailer(cloudOwner) : cloudRegionId;
   };
 
+
+
+
+
+  getLcpRegionsByOwningEntityAndLineOfBusiness = (owningEntityName, lineOfBusinessName): Observable<LcpRegion[]> => {
+    // let pathQuery: string = Constants.Path.AAI_GET_LCP_REGIONS_BY____
+    //   + "?"
+    //   + "owningEntityName=" + owningEntityName
+    //   + "lineOfBusinessName=" + lineOfBusinessName;
+
+    return of([
+      new LcpRegion("foo-id", "foo-name", true, "foo-cloud-owner"),
+      new LcpRegion("foo2-id", "foo2-name", true, "foo2-cloud-owner"),
+    ]);
+  };
+
+
+  getTenantsByCloudOwnerAndCloudRegionId = (cloudOwner, cloudRegionId): Observable<Tenant[]> => {
+    // let pathQuery: string = Constants.Path.AAI_GET_TENANTS_BY____
+    //   + "?"
+    //   + "cloudOwner=" + cloudOwner
+    //   + "&cloudRegionId=" + cloudRegionId;
+
+    return of([
+      new Tenant({
+        tenantID: "tenantID", tenantName: "tenantName",
+        cloudOwner: "cloudOwner", ['is-permitted']: true,
+      }),
+      new Tenant({
+        tenantID: "tenant2ID", tenantName: "tenant2Name",
+        cloudOwner: "cloudOwner", ['is-permitted']: true,
+      }),
+    ])
+  };
+
+
+
+
+
   public static formatCloudOwnerTrailer(cloudOwner: string):string {
     return " ("+ cloudOwner.trim().toLowerCase().replace(/^[^-]*-/, "").toUpperCase() + ")";
   }