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)]));
+            });
+        }
+    }
 }
diff --git a/src/app/users/add-user/AddEditUserComponent.html b/src/app/users/add-user/AddEditUserComponent.html
index b4d9d28..8c496cc 100644
--- a/src/app/users/add-user/AddEditUserComponent.html
+++ b/src/app/users/add-user/AddEditUserComponent.html
@@ -74,8 +74,8 @@
     <div class="form-group row" *ngIf="userType === '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/users/add-user/AddEditUserComponent.ts b/src/app/users/add-user/AddEditUserComponent.ts
index 61540e8..d988548 100644
--- a/src/app/users/add-user/AddEditUserComponent.ts
+++ b/src/app/users/add-user/AddEditUserComponent.ts
@@ -25,7 +25,7 @@
 import { TranslateService } from '@ngx-translate/core';
 import { NotifierService } from 'angular-notifier';
 import { AuthenticationService } from 'AuthenticationService';
-import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel';
+import { APIURLHEADER, ERRORDATA, LOGINPARAMS, MODALCLOSERESPONSEDATA, TYPESECTION } from 'CommonModel';
 import { environment } from 'environment';
 import { RestService } from 'RestService';
 import { SharedService } from 'SharedService';
@@ -36,220 +36,201 @@
  * @Component takes AddEditUserComponent.html as template url
  */
 @Component({
-  templateUrl: './AddEditUserComponent.html',
-  styleUrls: ['./AddEditUserComponent.scss']
+    templateUrl: './AddEditUserComponent.html',
+    styleUrls: ['./AddEditUserComponent.scss']
 })
 /** Exporting a class @exports AddEditUserComponent */
 export class AddEditUserComponent implements OnInit {
-  /** To inject services @public */
-  public injector: Injector;
+    /** To inject services @public */
+    public injector: Injector;
 
-  /** Instance for active modal service @public */
-  public activeModal: NgbActiveModal;
+    /** Instance for active modal service @public */
+    public activeModal: NgbActiveModal;
 
-  /** FormGroup user Edit Account added to the form @ html @public */
-  public userForm: FormGroup;
+    /** FormGroup user Edit Account added to the form @ html @public */
+    public userForm: FormGroup;
 
-  /** Form submission Add */
-  public submitted: boolean = false;
+    /** Form submission Add */
+    public submitted: boolean = false;
 
-  /** Input contains Modal dialog component Instance @public */
-  @Input() public userTitle: string;
+    /** Input contains Modal dialog component Instance @public */
+    @Input() public userTitle: string;
 
-  /** Input contains Modal dialog component Instance @public */
-  @Input() public userType: string;
+    /** Input contains Modal dialog component Instance @public */
+    @Input() public userType: string;
 
-  /** Input contains Modal dialog component Instance @public */
-  @Input() public userID: string;
+    /** Input contains Modal dialog component Instance @public */
+    @Input() public userID: string;
 
-  /** Input contains Modal dialog component Instance @public */
-  @Input() public userName: string;
+    /** Input contains Modal dialog component Instance @public */
+    @Input() public userName: string;
 
-  /** 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[] = [];
 
-  /** Instance of the rest service @private */
-  private restService: RestService;
+    /** Instance of the rest service @private */
+    private restService: RestService;
 
-  /** FormBuilder instance added to the formBuilder @private */
-  private formBuilder: FormBuilder;
+    /** FormBuilder instance added to the formBuilder @private */
+    private formBuilder: FormBuilder;
 
-  /** Controls the header form @private */
-  private headers: HttpHeaders;
+    /** Controls the header form @private */
+    private headers: HttpHeaders;
 
-  /** 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;
 
-  /** Utilizes auth service for any auth operations @private */
-  private authService: AuthenticationService;
+    /** Utilizes auth service for any auth operations @private */
+    private authService: AuthenticationService;
 
-  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.notifierService = this.injector.get(NotifierService);
-    this.translateService = this.injector.get(TranslateService);
-    this.sharedService = this.injector.get(SharedService);
-    this.authService = this.injector.get(AuthenticationService);
+    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.notifierService = this.injector.get(NotifierService);
+        this.translateService = this.injector.get(TranslateService);
+        this.sharedService = this.injector.get(SharedService);
+        this.authService = this.injector.get(AuthenticationService);
 
-    /** Initializing Form Action */
-    this.userForm = this.formBuilder.group({
-      userName: ['', Validators.required],
-      password: [null, [Validators.required, Validators.pattern(this.sharedService.REGX_PASSWORD_PATTERN)]],
-      password2: [null, Validators.required],
-      domain_name: [null]
-    });
-  }
-
-  /** convenience getter for easy access to form fields */
-  get f(): FormGroup['controls'] { return this.userForm.controls; }
-
-  /** Lifecyle Hooks the trigger before component is instantiate @public */
-  public ngOnInit(): void {
-    this.headers = new HttpHeaders({
-      'Content-Type': 'application/json',
-      Accept: 'application/json',
-      'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
-    });
-    if (this.userType === 'add') {
-      this.getDomainName();
-    } else if (this.userType === 'editUserName') {
-      this.userForm.patchValue({ userName: this.userName });
+        /** Initializing Form Action */
+        this.userForm = this.formBuilder.group({
+            userName: ['', Validators.required],
+            password: [null, [Validators.required, Validators.pattern(this.sharedService.REGX_PASSWORD_PATTERN)]],
+            password2: [null, Validators.required],
+            domain_name: [null]
+        });
     }
-  }
 
-  /** On modal submit users acction will called @public */
-  public userAction(userType: string): void {
-    if (userType === 'editPassword') {
-      this.getFormControl('userName').setValidators([]);
-      this.getFormControl('userName').updateValueAndValidity();
-    } else if (userType === 'editUserName') {
-      this.getFormControl('password').setValidators([]);
-      this.getFormControl('password').updateValueAndValidity();
-      this.getFormControl('password2').setValidators([]);
-      this.getFormControl('password2').updateValueAndValidity();
-    }
-    this.submitted = true;
-    this.modalData = {
-      message: 'Done'
-    };
-    this.sharedService.cleanForm(this.userForm);
-    if (!this.userForm.invalid) {
-      if (this.userForm.value.password !== this.userForm.value.password2) {
-        this.notifierService.notify('error', this.translateService.instant('PAGE.USERS.PASSWORDCONFLICT'));
-        return;
-      }
-      if (userType === 'add') {
-        this.addUser();
-      } else if (userType === 'editUserName' || userType === 'editPassword') {
-        this.editUser();
-      }
-    }
-  }
+    /** convenience getter for easy access to form fields */
+    get f(): FormGroup['controls'] { return this.userForm.controls; }
 
-  /** Add user @public */
-  public addUser(): void {
-    this.isLoadingResults = true;
-    const payLoad: {} = JSON.stringify({
-      username: (this.userForm.value.userName).toLowerCase(),
-      password: (this.userForm.value.password),
-      domain_name: !isNullOrUndefined(this.userForm.value.domain_name) ? this.userForm.value.domain_name : undefined
-    });
-    const apiURLHeader: APIURLHEADER = {
-      url: environment.USERS_URL,
-      httpOptions: { headers: this.headers }
-    };
-    this.restService.postResource(apiURLHeader, payLoad).subscribe((result: {}) => {
-      this.activeModal.close(this.modalData);
-      this.isLoadingResults = false;
-      this.notifierService.notify('success', this.translateService.instant('PAGE.USERS.CREATEDSUCCESSFULLY'));
-    }, (error: ERRORDATA) => {
-      this.restService.handleError(error, 'post');
-      this.isLoadingResults = false;
-    });
-  }
-
-  /** Edit user @public */
-  public editUser(): void {
-    this.isLoadingResults = true;
-    const payLoad: { username?: string, password?: string } = {};
-    if (this.userType === 'editPassword') {
-      payLoad.password = (this.userForm.value.password);
-    } else {
-      payLoad.username = this.userForm.value.userName.toLowerCase();
-    }
-    const apiURLHeader: APIURLHEADER = {
-      url: environment.USERS_URL + '/' + this.userID,
-      httpOptions: { headers: this.headers }
-    };
-    this.restService.patchResource(apiURLHeader, payLoad).subscribe((result: {}) => {
-      this.checkUsername(payLoad);
-      this.activeModal.close(this.modalData);
-      this.isLoadingResults = false;
-      this.notifierService.notify('success', this.translateService.instant('PAGE.USERS.EDITEDSUCCESSFULLY'));
-    }, (error: ERRORDATA) => {
-      this.restService.handleError(error, 'put');
-      this.isLoadingResults = false;
-    });
-  }
-  /** Get domain name @private */
-  private getDomainName(): void {
-    this.isLoadingResults = true;
-    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 });
+    /** Lifecyle Hooks the trigger before component is instantiate @public */
+    public ngOnInit(): void {
+        this.headers = new HttpHeaders({
+            'Content-Type': 'application/json',
+            Accept: 'application/json',
+            'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
+        });
+        if (this.userType === 'add') {
+            this.getDomainList();
+        } else if (this.userType === 'editUserName') {
+            this.userForm.patchValue({ userName: this.userName });
         }
-      });
     }
-  }
 
-  /** Used to get the AbstractControl of controlName passed @private */
-  private getFormControl(controlName: string): AbstractControl {
-    return this.userForm.controls[controlName];
-  }
-
-  /** Method to check loggedin username and update  @private */
-  private checkUsername(payLoad: { username?: string }): void {
-    const logUsername: string = localStorage.getItem('username');
-    if (this.userType === 'editUserName' && logUsername === this.userName) {
-      this.authService.userName.next(payLoad.username);
-      localStorage.setItem('username', payLoad.username);
+    /** On modal submit users acction will called @public */
+    public userAction(userType: string): void {
+        if (userType === 'editPassword') {
+            this.getFormControl('userName').setValidators([]);
+            this.getFormControl('userName').updateValueAndValidity();
+        } else if (userType === 'editUserName') {
+            this.getFormControl('password').setValidators([]);
+            this.getFormControl('password').updateValueAndValidity();
+            this.getFormControl('password2').setValidators([]);
+            this.getFormControl('password2').updateValueAndValidity();
+        }
+        this.submitted = true;
+        this.modalData = {
+            message: 'Done'
+        };
+        this.sharedService.cleanForm(this.userForm);
+        if (!this.userForm.invalid) {
+            if (this.userForm.value.password !== this.userForm.value.password2) {
+                this.notifierService.notify('error', this.translateService.instant('PAGE.USERS.PASSWORDCONFLICT'));
+                return;
+            }
+            if (userType === 'add') {
+                this.addUser();
+            } else if (userType === 'editUserName' || userType === 'editPassword') {
+                this.editUser();
+            }
+        }
     }
-  }
+
+    /** Add user @public */
+    public addUser(): void {
+        this.isLoadingResults = true;
+        const payLoad: {} = JSON.stringify({
+            username: (this.userForm.value.userName).toLowerCase(),
+            password: (this.userForm.value.password),
+            domain_name: !isNullOrUndefined(this.userForm.value.domain_name) ? this.userForm.value.domain_name : undefined
+        });
+        const apiURLHeader: APIURLHEADER = {
+            url: environment.USERS_URL,
+            httpOptions: { headers: this.headers }
+        };
+        this.restService.postResource(apiURLHeader, payLoad).subscribe((result: {}): void => {
+            this.activeModal.close(this.modalData);
+            this.isLoadingResults = false;
+            this.notifierService.notify('success', this.translateService.instant('PAGE.USERS.CREATEDSUCCESSFULLY'));
+        }, (error: ERRORDATA): void => {
+            this.restService.handleError(error, 'post');
+            this.isLoadingResults = false;
+        });
+    }
+
+    /** Edit user @public */
+    public editUser(): void {
+        this.isLoadingResults = true;
+        const payLoad: LOGINPARAMS = {};
+        if (this.userType === 'editPassword') {
+            payLoad.password = (this.userForm.value.password);
+        } else {
+            payLoad.username = this.userForm.value.userName.toLowerCase();
+        }
+        const apiURLHeader: APIURLHEADER = {
+            url: environment.USERS_URL + '/' + this.userID,
+            httpOptions: { headers: this.headers }
+        };
+        this.restService.patchResource(apiURLHeader, payLoad).subscribe((result: {}): void => {
+            this.checkUsername(payLoad);
+            this.activeModal.close(this.modalData);
+            this.isLoadingResults = false;
+            this.notifierService.notify('success', this.translateService.instant('PAGE.USERS.EDITEDSUCCESSFULLY'));
+        }, (error: ERRORDATA): void => {
+            this.restService.handleError(error, 'put');
+            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.userForm.controls[controlName];
+    }
+
+    /** Method to check loggedin username and update  @private */
+    private checkUsername(payLoad: LOGINPARAMS): void {
+        const logUsername: string = localStorage.getItem('username');
+        if (this.userType === 'editUserName' && logUsername === this.userName) {
+            this.authService.userName.next(payLoad.username);
+            localStorage.setItem('username', payLoad.username);
+        }
+    }
 }
diff --git a/src/models/CommonModel.ts b/src/models/CommonModel.ts
index fb9707a..5a6be7b 100644
--- a/src/models/CommonModel.ts
+++ b/src/models/CommonModel.ts
@@ -244,7 +244,7 @@
     additional_conf: '',
     use_existing_flavors: ''
 };
-/** Interface for VIM type AWS's Config */
+/** Constant for VIM type AWS's Config */
 export const TYPEAWS: {} = {
     sdn_controller: '',
     vpc_cidr_block: '',
@@ -256,7 +256,7 @@
     flavor_info: '',
     additional_conf: ''
 };
-/** Interface for VIM type VMWARE's Config */
+/** Constant for VIM type VMWARE's Config */
 export const TYPEVMWARE: {} = {
     sdn_controller: '',
     orgname: '',
@@ -276,14 +276,14 @@
     vrops_password: '',
     additional_conf: ''
 };
-/** Interface for VIM type OPENVIMNEBULA's Config */
+/** Constant for VIM type OPENVIMNEBULA's Config */
 export const TYPEOPENVIMNEBULA: {} = {
     sdn_controller: '',
     sdn_port_mapping: '',
     vim_network_name: '',
     additional_conf: ''
 };
-/** Interface for VIM type AZURE's Config */
+/** Constant for VIM type AZURE's Config */
 export const TYPEAZURE: {} = {
     subscription_id: '',
     region_name: '',
@@ -291,7 +291,7 @@
     vnet_name: '',
     flavors_pattern: ''
 };
-/** Interface for VIM other type Config */
+/** Constant for VIM other type Config */
 export const TYPEOTERS: {} = {
     sdn_controller: '',
     sdn_port_mapping: '',
@@ -301,3 +301,13 @@
     additional_conf: '',
     use_existing_flavors: ''
 };
+/** Interface for Domains */
+export interface DOMAINS {
+    project_domain_name: string;
+    user_domain_name: string;
+}
+/** Interface for Login */
+export interface LOGINPARAMS {
+    username?: string;
+    password?: string;
+}
diff --git a/src/services/SharedService.ts b/src/services/SharedService.ts
index 48fbb17..0c7cfc8 100644
--- a/src/services/SharedService.ts
+++ b/src/services/SharedService.ts
@@ -23,12 +23,25 @@
 import { FormArray, FormGroup } from '@angular/forms';
 import { Router } from '@angular/router';
 import { TranslateService } from '@ngx-translate/core';
-import { CONSTANTNUMBER, ERRORDATA, FILESETTINGS, GETAPIURLHEADER, PACKAGEINFO, PAGERSMARTTABLE, SMARTTABLECLASS, TARSETTINGS } from 'CommonModel';
+import {
+    CONSTANTNUMBER,
+    DOMAINS,
+    ERRORDATA,
+    FILESETTINGS,
+    GETAPIURLHEADER,
+    PACKAGEINFO,
+    PAGERSMARTTABLE,
+    SMARTTABLECLASS,
+    TARSETTINGS,
+    TYPESECTION
+} from 'CommonModel';
 import { environment } from 'environment';
 import * as HttpStatus from 'http-status-codes';
 import * as untar from 'js-untar';
 import * as pako from 'pako';
 import { RestService } from 'RestService';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
 import { isNullOrUndefined } from 'util';
 
 /** This is added globally by the tar.js library */
@@ -158,6 +171,7 @@
         }
         return result;
     }
+
     /** Function to read uploaded file String @public */
     public async getFileString(files: FileList, fileType: string): Promise<string | ArrayBuffer> {
         const reader: FileReader = new FileReader();
@@ -178,6 +192,7 @@
             };
         });
     }
+
     /** Method to handle tar and tar.gz file for shared YAML file content @public */
     public async targzFile(packageInfo: PACKAGEINFO): Promise<string | ArrayBuffer> {
         return new Promise<string | ArrayBuffer>((resolve: Function, reject: Function): void => {
@@ -185,15 +200,15 @@
             let apiUrl: string = '';
             apiUrl = packageInfo.packageType === 'nsd' ? environment.NSDESCRIPTORS_URL + '/' + packageInfo.id + '/nsd_content' :
                 environment.VNFPACKAGES_URL + '/' + packageInfo.id + '/package_content';
-            this.restService.getResource(apiUrl, httpOptions).subscribe((response: ArrayBuffer) => {
+            this.restService.getResource(apiUrl, httpOptions).subscribe((response: ArrayBuffer): void => {
                 try {
                     // tslint:disable-next-line: no-any
                     const tar: any = new Tar();
                     const originalInput: Uint8Array = pako.inflate(response, { to: 'Uint8Array' });
-                    untar(originalInput.buffer).then((extractedFiles: TARSETTINGS[]) => {
+                    untar(originalInput.buffer).then((extractedFiles: TARSETTINGS[]): void => {
                         const getFoldersFiles: {}[] = extractedFiles;
                         const folderNameStr: string = extractedFiles[0].name;
-                        getFoldersFiles.forEach((value: TARSETTINGS) => {
+                        getFoldersFiles.forEach((value: TARSETTINGS): void => {
                             const fileValueObj: FILESETTINGS = this.createFileValueObject(value);
                             const getRootFolder: string[] = value.name.split('/');
                             if (value.name.startsWith(folderNameStr) &&
@@ -209,13 +224,13 @@
                         const out: Uint8Array = tar.out;
                         const originalOutput: Uint8Array = pako.gzip(out);
                         resolve(originalOutput.buffer);
-                    }, (err: string) => {
+                    }, (err: string): void => {
                         reject('');
                     });
                 } catch (e) {
                     reject('');
                 }
-            }, (error: HttpErrorResponse) => {
+            }, (error: HttpErrorResponse): void => {
                 if (error.status === HttpStatus.NOT_FOUND || error.status === HttpStatus.UNAUTHORIZED) {
                     this.router.navigateByUrl('404', { skipLocationChange: true }).catch();
                 } else {
@@ -225,6 +240,7 @@
             });
         });
     }
+
     /** Method to return the file information @public */
     public createFileValueObject(value: TARSETTINGS): FILESETTINGS {
         return {
@@ -234,6 +250,7 @@
             group: value.gname
         };
     }
+
     /** Method to check given string is JSON or not @public */
     public checkJson(jsonString: string): boolean {
         jsonString = jsonString.replace(/'/g, '"');
@@ -244,6 +261,7 @@
         }
         return true;
     }
+
     /** Clean the form before submit @public */
     public cleanForm(formGroup: FormGroup, formName?: String): void {
         Object.keys(formGroup.controls).forEach((key: string) => {
@@ -265,6 +283,7 @@
             }
         });
     }
+
     /** Method to return the config of pager value for ngSmarttable @public */
     public paginationPagerConfig(): PAGERSMARTTABLE {
         return {
@@ -272,12 +291,14 @@
             perPage: environment.paginationNumber
         };
     }
+
     /** Method to return the class for the table for ngSmarttable @public */
     public tableClassConfig(): SMARTTABLECLASS {
         return {
             class: 'table list-data'
         };
     }
+
     /** Method to return all languages name and its code @public */
     public languageCodeList(): {}[] {
         return [
@@ -287,20 +308,22 @@
             { code: 'de', language: 'German' }
         ];
     }
+
     /** Fetch OSM Version @public */
     public fetchOSMVersion(): void {
-        this.restService.getResource(environment.OSM_VERSION_URL).subscribe((res: { version: string }) => {
+        this.restService.getResource(environment.OSM_VERSION_URL).subscribe((res: { version: string }): void => {
             const version: string[] = res.version.split('+');
             if (!isNullOrUndefined(version[0])) {
                 this.osmVersion = version[0];
             } else {
                 this.osmVersion = null;
             }
-        }, (error: ERRORDATA) => {
+        }, (error: ERRORDATA): void => {
             this.osmVersion = null;
             this.restService.handleError(error, 'get');
         });
     }
+
     /** Random RGB color code generator @public */
     public generateColor(): string {
         const x: number = Math.floor(Math.random() * this.colorStringLength);
@@ -319,6 +342,33 @@
         return fileInfo[0].name.substring(fileInfo[0].name.lastIndexOf('.') + 1);
     }
 
+    /** Get domain name @private */
+    public getDomainName(): Observable<TYPESECTION[]> {
+        return this.restService.getResource(environment.DOMAIN_URL).pipe(map((domains: DOMAINS): TYPESECTION[] => {
+            const domainList: TYPESECTION[] = [];
+            try {
+                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));
+                if (domainNames.length > 0) {
+                    domainNames.forEach((domainName: string): void => {
+                        if (!domainName.endsWith(':ro')) {
+                            domainList.push({ title: domainName, value: domainName });
+                        }
+                    });
+                }
+                return domainList;
+            } catch (e) {
+                return domainList;
+            }
+        }));
+    }
+
     /** Method to validate file extension and size @private */
     private vaildataFileInfo(fileInfo: File, fileType: string): boolean {
         const extension: string = fileInfo.name.substring(fileInfo.name.lastIndexOf('.') + 1);
@@ -331,6 +381,7 @@
         }
         return false;
     }
+
     /** Method to read file content based on type @private */
     private readFileContent(reader: FileReader, fileInfo: File, fileType: string): void {
         if (fileType === 'gz') {
@@ -339,6 +390,7 @@
             reader.readAsText(fileInfo);
         }
     }
+
     /** Method to handle http options @public */
     private getHttpOptions(): GETAPIURLHEADER {
         return {
