diff --git a/src/app/projects/project-create-update/ProjectCreateUpdateComponent.html b/src/app/projects/project-create-update/ProjectCreateUpdateComponent.html
index 8afb727..b621a53 100644
--- a/src/app/projects/project-create-update/ProjectCreateUpdateComponent.html
+++ b/src/app/projects/project-create-update/ProjectCreateUpdateComponent.html
@@ -42,8 +42,8 @@
     <div class="form-group row" *ngIf="getProjectType === 'Add'">
       <label class="col-sm-4 col-form-label">{{'DOMAIN' | translate}} {{'NAME' | translate}}</label>
       <div class="col-sm-8">
-        <ng-select [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="domains" bindLabel="text"
-          bindValue="id" formControlName="domain_name" id="domain_name"
+        <ng-select [clearable]="false" placeholder="{{'SELECT' | translate}}" [items]="domains" bindLabel="title"
+          bindValue="value" formControlName="domain_name" id="domain_name"
           [ngClass]="{ 'is-invalid': submitted && f.domain_name.errors }"></ng-select>
       </div>
     </div>
diff --git a/src/app/projects/project-create-update/ProjectCreateUpdateComponent.ts b/src/app/projects/project-create-update/ProjectCreateUpdateComponent.ts
index ba176e0..01f963e 100644
--- a/src/app/projects/project-create-update/ProjectCreateUpdateComponent.ts
+++ b/src/app/projects/project-create-update/ProjectCreateUpdateComponent.ts
@@ -23,10 +23,10 @@
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { TranslateService } from '@ngx-translate/core';
 import { NotifierService } from 'angular-notifier';
-import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel';
+import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, TYPESECTION } from 'CommonModel';
 import { DataService } from 'DataService';
 import { environment } from 'environment';
-import { ProjectData, ProjectDetails, QUOTA_ITEMS, QUOTAITEM} from 'ProjectModel';
+import { ProjectData, ProjectDetails, QUOTAITEM, QUOTA_ITEMS } from 'ProjectModel';
 import { ProjectService } from 'ProjectService';
 import { RestService } from 'RestService';
 import { SharedService } from 'SharedService';
@@ -37,257 +37,239 @@
  * @Component takes ProjectCreateUpdateComponent.html as template url
  */
 @Component({
-  selector: 'app-project-create-update',
-  templateUrl: './ProjectCreateUpdateComponent.html',
-  styleUrls: ['./ProjectCreateUpdateComponent.scss']
+    selector: 'app-project-create-update',
+    templateUrl: './ProjectCreateUpdateComponent.html',
+    styleUrls: ['./ProjectCreateUpdateComponent.scss']
 })
 /** Exporting a class @exports ProjectCreateUpdateComponent */
 export class ProjectCreateUpdateComponent implements OnInit {
-  /** To inject services @public */
-  public injector: Injector;
+    /** To inject services @public */
+    public injector: Injector;
 
-  /** Instance of the rest service @public */
-  public restService: RestService;
+    /** Instance of the rest service @public */
+    public restService: RestService;
 
-  /** Instance for active modal service @public */
-  public activeModal: NgbActiveModal;
+    /** Instance for active modal service @public */
+    public activeModal: NgbActiveModal;
 
-  /** Contains the recently created project details @public */
-  public recentProject: ProjectDetails;
+    /** Contains the recently created project details @public */
+    public recentProject: ProjectDetails;
 
-  /** Contains project create or edit @public */
-  public getProjectType: string;
+    /** Contains project create or edit @public */
+    public getProjectType: string;
 
-  /** To inject input type services @public */
-  @Input() public projectType: string;
+    /** To inject input type services @public */
+    @Input() public projectType: string;
 
-  /** FormGroup user Edit Account added to the form @ html @public */
-  public projectForm: FormGroup;
+    /** FormGroup user Edit Account added to the form @ html @public */
+    public projectForm: FormGroup;
 
-  /** Form submission Add */
-  public submitted: boolean = false;
+    /** Form submission Add */
+    public submitted: boolean = false;
 
-  /** Check the loading results for loader status @public */
-  public isLoadingResults: boolean = false;
+    /** Check the loading results for loader status @public */
+    public isLoadingResults: boolean = false;
 
-  /** Give the message for the loading @public */
-  public message: string = 'PLEASEWAIT';
+    /** Give the message for the loading @public */
+    public message: string = 'PLEASEWAIT';
 
-  /** Holds list of domains @public */
-  public domains: {}[] = [];
+    /** Holds list of domains @public */
+    public domains: TYPESECTION[] = [];
 
-  /** Holds list of quota items @public */
-  public quotaItems: QUOTAITEM[] = QUOTA_ITEMS;
+    /** Holds list of quota items @public */
+    public quotaItems: QUOTAITEM[] = QUOTA_ITEMS;
 
-  /** Holds project reference from response  @public */
-  public quotaRefs: {} = null;
+    /** Holds project reference from response  @public */
+    public quotaRefs: {} = null;
 
-  /** FormBuilder instance added to the formBuilder @private */
-  private formBuilder: FormBuilder;
+    /** FormBuilder instance added to the formBuilder @private */
+    private formBuilder: FormBuilder;
 
-  /** DataService to pass the data from one component to another @private */
-  private dataService: DataService;
+    /** DataService to pass the data from one component to another @private */
+    private dataService: DataService;
 
-  /** Contains project name ref @private */
-  private projectRef: string;
+    /** Contains project name ref @private */
+    private projectRef: string;
 
-  /** Notifier service to popup notification @private */
-  private notifierService: NotifierService;
+    /** Notifier service to popup notification @private */
+    private notifierService: NotifierService;
 
-  /** Contains tranlsate instance @private */
-  private translateService: TranslateService;
+    /** Contains tranlsate instance @private */
+    private translateService: TranslateService;
 
-  /** Contains all methods related to shared @private */
-  private sharedService: SharedService;
+    /** Contains all methods related to shared @private */
+    private sharedService: SharedService;
 
-  /** ModalData instance of modal @private  */
-  private modalData: MODALCLOSERESPONSEDATA;
+    /** ModalData instance of modal @private  */
+    private modalData: MODALCLOSERESPONSEDATA;
 
-  /** Holds all project details @private */
-  private projectService: ProjectService;
+    /** Holds all project details @private */
+    private projectService: ProjectService;
 
-  constructor(injector: Injector) {
-    this.injector = injector;
-    this.formBuilder = this.injector.get(FormBuilder);
-    this.restService = this.injector.get(RestService);
-    this.activeModal = this.injector.get(NgbActiveModal);
-    this.dataService = this.injector.get(DataService);
-    this.notifierService = this.injector.get(NotifierService);
-    this.translateService = this.injector.get(TranslateService);
-    this.sharedService = this.injector.get(SharedService);
-    this.projectService = this.injector.get(ProjectService);
-    /** Initializing Form Action */
-    this.projectForm = this.formBuilder.group({
-      project_name: ['', Validators.required],
-      domain_name: [null],
-      enable_quota: [false, Validators.required]
-    });
-  }
-
-  /** convenience getter for easy access to form fields */
-  get f(): FormGroup['controls'] { return this.projectForm.controls; }
-
-  /** Lifecyle Hooks the trigger before component is instantiate @public */
-  public ngOnInit(): void {
-    this.getProjectType = this.projectType;
-    if (this.getProjectType === 'Edit') {
-      this.dataService.currentMessage.subscribe((data: ProjectData) => {
-        if (data.projectName !== undefined || data.projectName !== '' || data.projectName !== null) {
-          this.projectForm.patchValue({ project_name: data.projectName });
-          this.projectRef = data.id;
-          this.quotaRefs = data.quotas;
-          this.patchQuotaInfo(this.quotaRefs);
-        }
-      });
-    } else {
-      this.patchQuotaInfo();
-      this.getProjects();
+    constructor(injector: Injector) {
+        this.injector = injector;
+        this.formBuilder = this.injector.get(FormBuilder);
+        this.restService = this.injector.get(RestService);
+        this.activeModal = this.injector.get(NgbActiveModal);
+        this.dataService = this.injector.get(DataService);
+        this.notifierService = this.injector.get(NotifierService);
+        this.translateService = this.injector.get(TranslateService);
+        this.sharedService = this.injector.get(SharedService);
+        this.projectService = this.injector.get(ProjectService);
+        /** Initializing Form Action */
+        this.projectForm = this.formBuilder.group({
+            project_name: ['', Validators.required],
+            domain_name: [null],
+            enable_quota: [false, Validators.required]
+        });
     }
-  }
 
-  /** Get the last project name @public */
-  public getProjects(): void {
-    this.isLoadingResults = true;
-    this.restService.getResource(environment.PROJECTS_URL).subscribe((projects: ProjectDetails[]) => {
-      this.recentProject = projects.slice(-1).pop();
-      this.getDomainName();
-    }, (error: ERRORDATA) => {
-      this.restService.handleError(error, 'get');
-      this.isLoadingResults = false;
-    });
-  }
+    /** convenience getter for easy access to form fields */
+    get f(): FormGroup['controls'] { return this.projectForm.controls; }
 
-  /** On modal submit users acction will called @public */
-  public projectAction(userType: string): void {
-    this.submitted = true;
-    this.modalData = {
-      message: 'Done'
-    };
-    this.sharedService.cleanForm(this.projectForm);
-    if (!this.projectForm.invalid) {
-      if (userType === 'Add') {
-        this.createProject();
-      } else if (userType === 'Edit') {
-        this.editProject();
-      }
-    }
-  }
-
-  /** Create project @public */
-  public createProject(): void {
-    this.isLoadingResults = true;
-    const apiURLHeader: APIURLHEADER = {
-      url: environment.PROJECTS_URL
-    };
-    const projectPayload: ProjectDetails = {
-      name: this.projectForm.value.project_name,
-      domain_name: !isNullOrUndefined(this.projectForm.value.domain_name) ? this.projectForm.value.domain_name : undefined
-    };
-    this.addQuotaLimit(projectPayload);
-    this.restService.postResource(apiURLHeader, projectPayload).subscribe(() => {
-      this.activeModal.close(this.modalData);
-      this.isLoadingResults = false;
-      this.notifierService.notify('success', this.translateService.instant('PAGE.PROJECT.CREATEDSUCCESSFULLY'));
-    }, (error: ERRORDATA) => {
-      this.restService.handleError(error, 'post');
-      this.isLoadingResults = false;
-    });
-  }
-  /** Handle enable quota limit checkbox event @public */
-  public checkQuota(): void {
-    if (this.getFormControl('enable_quota').value) {
-      this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
-        this.projectForm.addControl(quotaItem.value, new FormControl(quotaItem.minValue, Validators.required));
-      });
-    } else {
-      this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
-        this.getFormControl(quotaItem.value).setValue(quotaItem.minValue);
-      });
-    }
-  }
-  /** Edit project @public */
-  public editProject(): void {
-    this.isLoadingResults = true;
-    const apiURLHeader: APIURLHEADER = {
-      url: environment.PROJECTS_URL + '/' + this.projectRef
-    };
-    const projectPayload: ProjectDetails = {
-      name: this.projectForm.value.project_name
-    };
-    this.addQuotaLimit(projectPayload);
-    this.restService.patchResource(apiURLHeader, projectPayload).subscribe(() => {
-      this.activeModal.close(this.modalData);
-      this.isLoadingResults = false;
-      this.projectService.setHeaderProjects();
-      this.notifierService.notify('success', this.translateService.instant('PAGE.PROJECT.UPDATEDSUCCESSFULLY'));
-    }, (error: ERRORDATA) => {
-      this.restService.handleError(error, 'patch');
-      this.isLoadingResults = false;
-    });
-  }
-  /** Get domain name @private */
-  private getDomainName(): void {
-    this.restService.getResource(environment.DOMAIN_URL).subscribe((domains: { project_domain_name: string, user_domain_name: string }) => {
-      let domainNames: string[] = [];
-      if (!isNullOrUndefined(domains.project_domain_name)) {
-        domainNames = domainNames.concat(domains.project_domain_name.split(','));
-      }
-      if (!isNullOrUndefined(domains.user_domain_name)) {
-        domainNames = domainNames.concat(domains.user_domain_name.split(','));
-      }
-      domainNames = Array.from(new Set(domainNames));
-      this.checkDomainNames(domainNames);
-      this.isLoadingResults = false;
-    }, (error: ERRORDATA) => {
-      this.restService.handleError(error, 'get');
-      this.isLoadingResults = false;
-    });
-  }
-
-  /** Check the domain names and create modal for domain select @private */
-  private checkDomainNames(domainNames: string[]): void {
-    if (domainNames.length > 0) {
-      domainNames.forEach((domainName: string) => {
-        if (!domainName.endsWith(':ro')) {
-          this.domains.push({ id: domainName, text: domainName });
-        }
-      });
-    }
-  }
-
-  /** Used to get the AbstractControl of controlName passed @private */
-  private getFormControl(controlName: string): AbstractControl {
-    return this.projectForm.controls[controlName];
-  }
-
-  /** Add quota information to payload @private */
-  private addQuotaLimit(payload: ProjectDetails): void {
-    if (this.getFormControl('enable_quota').value) {
-      payload.quotas = {};
-      this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
-        payload.quotas[quotaItem.value] = this.getFormControl(quotaItem.value).value;
-      });
-    }
-  }
-
-  /** Set quota information in project form model @private */
-  private patchQuotaInfo(quotaRef?: {}): void {
-    if (quotaRef !== null && this.getProjectType === 'Edit') {
-      this.getFormControl('enable_quota').setValue(true);
-      this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
-        if (!isNullOrUndefined(quotaRef[quotaItem.value])) {
-          this.projectForm.addControl(quotaItem.value, new FormControl(quotaRef[quotaItem.value],
-            [Validators.required, Validators.min(quotaItem.minValue), Validators.max(quotaItem.maxValue)]));
+    /** Lifecyle Hooks the trigger before component is instantiate @public */
+    public ngOnInit(): void {
+        this.getProjectType = this.projectType;
+        if (this.getProjectType === 'Edit') {
+            this.dataService.currentMessage.subscribe((data: ProjectData): void => {
+                if (data.projectName !== undefined || data.projectName !== '' || data.projectName !== null) {
+                    this.projectForm.patchValue({ project_name: data.projectName });
+                    this.projectRef = data.id;
+                    this.quotaRefs = data.quotas;
+                    this.patchQuotaInfo(this.quotaRefs);
+                }
+            });
         } else {
-          this.projectForm.addControl(quotaItem.value, new FormControl(quotaItem.minValue, [Validators.required,
-          Validators.min(quotaItem.minValue), Validators.max(quotaItem.maxValue)]));
+            this.patchQuotaInfo();
+            this.getProjects();
         }
-      });
-    } else {
-      this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
-        this.projectForm.addControl(quotaItem.value, new FormControl(quotaItem.minValue, [Validators.required,
-        Validators.min(quotaItem.minValue), Validators.max(quotaItem.maxValue)]));
-      });
     }
-  }
+
+    /** Get the last project name @public */
+    public getProjects(): void {
+        this.isLoadingResults = true;
+        this.restService.getResource(environment.PROJECTS_URL).subscribe((projects: ProjectDetails[]): void => {
+            this.recentProject = projects.slice(-1).pop();
+            this.getDomainList();
+        }, (error: ERRORDATA): void => {
+            this.restService.handleError(error, 'get');
+            this.isLoadingResults = false;
+        });
+    }
+
+    /** On modal submit users acction will called @public */
+    public projectAction(userType: string): void {
+        this.submitted = true;
+        this.modalData = {
+            message: 'Done'
+        };
+        this.sharedService.cleanForm(this.projectForm);
+        if (!this.projectForm.invalid) {
+            if (userType === 'Add') {
+                this.createProject();
+            } else if (userType === 'Edit') {
+                this.editProject();
+            }
+        }
+    }
+
+    /** Create project @public */
+    public createProject(): void {
+        this.isLoadingResults = true;
+        const apiURLHeader: APIURLHEADER = {
+            url: environment.PROJECTS_URL
+        };
+        const projectPayload: ProjectDetails = {
+            name: this.projectForm.value.project_name,
+            domain_name: !isNullOrUndefined(this.projectForm.value.domain_name) ? this.projectForm.value.domain_name : undefined
+        };
+        this.addQuotaLimit(projectPayload);
+        this.restService.postResource(apiURLHeader, projectPayload).subscribe((): void => {
+            this.activeModal.close(this.modalData);
+            this.isLoadingResults = false;
+            this.notifierService.notify('success', this.translateService.instant('PAGE.PROJECT.CREATEDSUCCESSFULLY'));
+        }, (error: ERRORDATA): void => {
+            this.restService.handleError(error, 'post');
+            this.isLoadingResults = false;
+        });
+    }
+    /** Handle enable quota limit checkbox event @public */
+    public checkQuota(): void {
+        if (this.getFormControl('enable_quota').value) {
+            this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
+                this.projectForm.addControl(quotaItem.value, new FormControl(quotaItem.minValue, Validators.required));
+            });
+        } else {
+            this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
+                this.getFormControl(quotaItem.value).setValue(quotaItem.minValue);
+            });
+        }
+    }
+    /** Edit project @public */
+    public editProject(): void {
+        this.isLoadingResults = true;
+        const apiURLHeader: APIURLHEADER = {
+            url: environment.PROJECTS_URL + '/' + this.projectRef
+        };
+        const projectPayload: ProjectDetails = {
+            name: this.projectForm.value.project_name
+        };
+        this.addQuotaLimit(projectPayload);
+        this.restService.patchResource(apiURLHeader, projectPayload).subscribe((): void => {
+            this.activeModal.close(this.modalData);
+            this.isLoadingResults = false;
+            this.projectService.setHeaderProjects();
+            this.notifierService.notify('success', this.translateService.instant('PAGE.PROJECT.UPDATEDSUCCESSFULLY'));
+        }, (error: ERRORDATA): void => {
+            this.restService.handleError(error, 'patch');
+            this.isLoadingResults = false;
+        });
+    }
+    /** Get domain name list @private */
+    private getDomainList(): void {
+        this.isLoadingResults = true;
+        this.sharedService.getDomainName().subscribe((domainList: TYPESECTION[]): void => {
+            this.domains = domainList;
+            this.isLoadingResults = false;
+        }, (error: ERRORDATA): void => {
+            this.isLoadingResults = false;
+            this.restService.handleError(error, 'get');
+        });
+    }
+
+    /** Used to get the AbstractControl of controlName passed @private */
+    private getFormControl(controlName: string): AbstractControl {
+        return this.projectForm.controls[controlName];
+    }
+
+    /** Add quota information to payload @private */
+    private addQuotaLimit(payload: ProjectDetails): void {
+        if (this.getFormControl('enable_quota').value) {
+            payload.quotas = {};
+            this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
+                payload.quotas[quotaItem.value] = this.getFormControl(quotaItem.value).value;
+            });
+        }
+    }
+
+    /** Set quota information in project form model @private */
+    private patchQuotaInfo(quotaRef?: {}): void {
+        if (quotaRef !== null && this.getProjectType === 'Edit') {
+            this.getFormControl('enable_quota').setValue(true);
+            this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
+                if (!isNullOrUndefined(quotaRef[quotaItem.value])) {
+                    this.projectForm.addControl(quotaItem.value, new FormControl(quotaRef[quotaItem.value],
+                        [Validators.required, Validators.min(quotaItem.minValue), Validators.max(quotaItem.maxValue)]));
+                } else {
+                    this.projectForm.addControl(quotaItem.value, new FormControl(quotaItem.minValue, [Validators.required,
+                    Validators.min(quotaItem.minValue), Validators.max(quotaItem.maxValue)]));
+                }
+            });
+        } else {
+            this.quotaItems.forEach((quotaItem: QUOTAITEM): void => {
+                this.projectForm.addControl(quotaItem.value, new FormControl(quotaItem.minValue, [Validators.required,
+                Validators.min(quotaItem.minValue), Validators.max(quotaItem.maxValue)]));
+            });
+        }
+    }
 }
